初始化多继承

  • 无论是单继承还是多继承,Python都不会自动初始化父类,必须手动初始化直接父类
  • 手动初始化父类有两种方法
# 第一种方法使用父类的类名,需要self参数
SuperClassName.__init__(self, params)

# 第二种方法用super()方法返回父类,不需要self参数
super().__init__(params)
  • 在多继承中,只能使用第一种方法
class Foo:
    def __init__(self, word):
        self.word = word


class Lar:
    def __init__(self, phrase):
        self.phrase = phrase


class Bar(Lar, Foo):
    def __init__(self, word, phrase):
        # 方法一
        Foo.__init__(self, word)
        Lar.__init__(self, phrase)

if __name__ == '__main__':
    bar = Bar('lucky', 'Sparrow')
    print(bar.word)
    print(bar.phrase)

# 输出
# lucky
# Sparrow

MRO

新式类都使用MRO继承规则

class A: pass
class B: pass
class C(B, A): pass
class D(A): pass
class E(C, D): pass

if __name__ == '__main__':
    print(D.__mro__)

# 输出
# (<class '__main__.E'>, <class '__main__.C'>, <class '__main__.B'>, \
# <class '__main__.D'>, <class '__main__.A'>, <class 'object'>)
# 顺序为 E C B D A object
  • MRO的规则简单而言是深度优先,从左到右,重复留最后。因此先输出C并递归遍历它,但C的父类A和object,在D中也出现,因此它们只保留最后出现的次序
  • MRO的作用:
    1. 属性赋值和访问的顺序,找到为止
    2. 方法调用的顺序,找到为止
    3. super()方法本质上时访问MRO的下一个目标,因此单继承时总是父节点



Zhu

有问题欢迎发邮件交流