May
9th,
2015
初始化多继承
- 无论是单继承还是多继承,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的作用:
- 属性赋值和访问的顺序,找到为止
- 方法调用的顺序,找到为止
- super()方法本质上时访问MRO的下一个目标,因此单继承时总是父节点