class Animal(object):
pass
class Dog(Animal):
def __init__(self,name):
self.name = name
class Cat(Animal):
def __init__(self,name):
self.name = name
class Person(Animal):
def __init__(self,name):
self.name = name
class Employee(Person):
def __init__(self,name,salary):
super(Employee,self).__init__(name)
self.salary = salary
class Fish(object):
pass
class Salmon(Fish):
pass
class Halibut(Fish):
pass
rover = Dog("Rover")
satan = Cat("satan")
mary = Person("Mary")
mary.pet = satan
frank = Employee("Frank",12000)
frank.pet = rover
flipper = Fish()
crouse = Salmon()
harry = Halibut()
习题45
关于泥鳅和鱼:
class和object是同样的东西,在不同时间名字不同而已。
ex:鱼和泥鳅都是鱼,但泥鳅是比较特殊的鱼。
鱼是class,描述具有同类属性的实例的概括性词汇。泥鳅是新的class,具有一些特定的属性。
ex:小方是一条泥鳅,所以他是泥鳅的一个实例instance(泥鳅也是鱼的一个实例)。你使用它做了道菜于是它就成为了对象object。
小方是泥鳅,泥鳅又属于鱼。所以对象属于类,一个类又属于另一个类。
区分class和object
is-a谈论两者以类的关系相互关联。鱼和泥鳅的关系
has-a两者无共同点,仅是互为参照的情况下。泥鳅和鳃的关系
为什么添加object,有什么含义:
小写的object作为一个类,在创建新类时把他继承下来。
class xxx(object)#python 3 中已经默认加上object
在创建class时会继承object方法,拥有除了自己定义的方法之外的一系列操作对象。
若不加object意味着不继承,则新类只有_doc_,_module_和自己定义的方法。
把class当object使用,创建时不新建方法,然后正常调用??不知道有没有理解错误题目意思
*执行函数时一直提示说name “xxx” is not defined。为什么,难道是占位符过多了。单纯从语法看没问题啊。
还是我调用时出了错。。
“是啥”我感觉两方都是类,一个是基类,一个是新类
“有啥”对应的是类里的方法。
多重继承:一个类可以同时继承多个父类的行为和特征功能。可能造成同一功能多次重写,带来维护问题。
class A(object):
class B(A):
class C(A):
class D(B, C):
通过 super().init(self)方法时,A 虽然被继承了两次,但__init__()只调用一次:
python如何实现类的继承:对于每一个定义的类,会有一个方法解析顺序列表(MRO)method resolvation order
print(C.mro)得到一个元组。对元组的从左到右依次查找,直到查到待查的属性为止。
当使用super()函数时,python会继续从MRO中的下一个类开始搜索,只要每一个重新定义过的方法(比如init())都使用了super()函数,并且调用了他们一次,那么控制流最终就可以遍历整个MRO列表,并且让每个方法都只被调用一次