python中的类继承

"""

"""
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,新式类有
"""

 

posted @ 2023-02-19 20:05  Wchime  阅读(34)  评论(0)    收藏  举报