有个重要的概念必须弄明白,那就是‘类’和‘对象’的区别。
原文中花费了大量语段来描述,我就按个人理解简单的归纳一下,可能不对,如有误,请指出:
1.类:就是具有相同属性的方法的集合,此处的方法就是指的函数,一个类里面包含大量的函数(方法),这些函数之间具有共同之处。
2.对象:对象就是类的实例化,类就是本体。本体是无法直接调用的,而对象就是类的副本,分身之类的东西,通过将类实例化得到对象,然后像变量一样赋值给一个东西,就可以通过这个东西调用这个类里面的方法。
3.从属关系:is-a(是什么)和has-a(有什么):
按照书中的例子,‘鱼’ 是一个类,‘泥鳅’ 也是一个类,‘泥鳅’ is-a ‘鱼’,则 ‘鱼’ 是 ‘泥鳅’ 的父类。‘泥鳅’ has-a ‘胡须’,则 ‘胡须’ 是 ‘泥鳅’ 的属性或者方法。
如果给这只 ‘泥鳅’ 取个名字,叫 ‘小李’,那么取名这个行为就叫做 ‘实例化’ ,如果你使用了 ‘小李’ (比如用它做了个菜),这样它是一个对象。
基础练习:
下面的代码不需要手码,甚至不需要运行,只要把注释下面的代码的关系写到注释后面就行了,主要是练习从属关系的:
## Animal is-a object (yes, sort of confusing) look at the extra credit
class Animal(object):
pass
##Dog is-a Animal
class Dog(Animal):
def __init__(self, name):
##??
self.name = name
##??
class Cat(Animal):
def __init__(self, name):
##??
self.name = name
##??
class Person(object):
def __init__(self, name):
##??
self.name = name
## Person has-a pet of some kind
self.pet = None
##??
class Employee(Person):
def __init__(self, name, salary):
##?? hmm what is this strange magic?
super(Employee, self).__init__(name)
##??
self.name = name
class Fish(object):
pass
##??
class Salmon(Fish):
pass
##??
class Halibut(Fish):
pass
## rover is-a Dog
rover = Dog("Rover")
##??
satan = Cat("Satan")
##??
mary = Person("Mary")
##??
mary.pet = satan
##??
frank = Employee("Frank", 120000)
##??
frank.pet = rover
##??
flipper = Fish()
##??
crouse = Salmon()
##??
harry = Halibut()
# ================================
有点错误,已经改掉
关于class Name(object)
在Python 3 中,你不需要在类名后面加(object),但是Python是一门优雅的语言,它信奉“显式优于隐式”,所以最好还是写上,至于(object)具体有什么含义,只要记住 class Name(objcet) 是一个“基本的简单类”就行了。
另,代码中有一行:super(Employes, self).__init__(name),是做什么用的?
这个是Python中调用父类的__init__方法的一个方法。详细了解可以百度 super Python 来了解一下。值得注意的是Python 3 中这个方法可以简化为 super().__init__(name)