"""
"""
class Animal(object):
def __init__(self,name,food):
self.name = name
self.food = food
self.blood = 100
self.waise = 100
def eat(self):
print(f"{self.name} eating {self.food}")
def drink(self):
print("hhh")
def sleep(self):
print("sss")
class Cat(Animal):
def eat(self):
self.blood += 100
Animal.eat(self)
def pashu(self):
print("pashu")
class Dog(Animal):
def eat(self):
self.waise += 100
Animal.eat(self)
def kanjia(self):
print("kanjia")
c = Cat("小白","猫粮")
c.eat()
print(c.__dict__)
"""
父类和子类方法的选择
子类的对象,如果去调用方法
永远先优先调用自己
如果自己有 用自己的
如果自己没有 用父类的
如果自己有还想用父类的:直接在子类方法中调用父类的方法 父类名.方法名(self)
"""
class Foo(object):
def __init__(self):
self.func() #在每一个self调用func时,我们不看这句话在哪里执行,只看self是谁
def func(self):
print("in foo")
class Son(Foo):
def func(self):
print("in son")
Son()
"""
多继承
"""
class A():
def func(self):
print("A")
class B(A):
def func(self):
print("B")
class C(A):
def func(self):
print("C")
class D(B,C):
def func(self):
print("D")
d = D()
d.func()
#在python3中总是广度优先走
#在python2中经典类总是深度优先走 在python2中新式类:括号里继承object 经典类:括号里没有object
"""
c3算法
A(O) = [AO]
B(A) = [BAO]
C(A) = [CAO]
D(B) = [DBAO]
E(C) = [ECAO]
F(D,E) = c3(D(B) + E(C))
= [F] + [DBAO] + [ECAO]
F = [DBAO] + [ECAO]
FD = [BAO] + [ECAO]
FDB = [AO] + [ECAO]
FDBE = [AO] + [CAO]
FDBEC = [AO] + [AO]
FDBECA = [O] + [O]
FDBECAO
算法内容
如果是单继承 那么总是按照从子类-》父类的顺序来计算查找顺序
如果是多继承,需要按照自己本类,父类1,父类2的继承顺序
merge规则:
如果一个类出现在从左到右所有顺序的最左侧,并且没有在其他位置出现,那么先提出来作为继承顺序中的一个
或者一个类出现在从左到右顺序的最左侧,并没有在其他顺序中出现,那么先提出来作为继承顺序中的一个
如果从左到右第一个顺序中的第一个类出现在后面且不是第一个,那么不能提取,顺序向后继续找其他顺序中符合上述条件的类
经典类-深度优先 新式类-广度优先
深度优先自己看
广度优先遵循c3算法,会用mro,会查看顺序
经典类没有mro,新式类有
"""