Python - 方法解析顺序的特点
Python - Peculiarities in method resolution order
让我们使用以下 Python2 代码:
#!/usr/bin/python
class A1(object):
def __init__(self):
super(A1, self).__init__()
print "A1.__init__"
class A2(A1):
def __init__(self):
super(A2, self).__init__()
print "A2.__init__"
class B1(object):
def __init__(self):
super(B1, self).__init__()
print "B1.__init__"
class B2(B1):
def __init__(self):
super(B2, self).__init__()
print "B2.__init__"
class C(A2, B2):
def __init__(self):
super(C, self).__init__()
print "C.__init__"
C()
print C.mro()
即C
继承自两个前身class分支,它们没有共同的祖先(除了默认的object
,不知道这有多重要)。代码输出:
B1.__init__
B2.__init__
A1.__init__
A2.__init__
C.__init__
[<class '__main__.C'>, <class '__main__.A2'>, <class '__main__.A1'>, <class '__main__.B2'>, <class '__main__.B1'>, <type 'object'>]
完全符合预期。
现在说我粗心忘了在A1
和B1
中调用super().__init__()
(我不太关心初始化object
.. .).然后输出变为:
A1.__init__
A2.__init__
C.__init__
[<class '__main__.C'>, <class '__main__.A2'>, <class '__main__.A1'>, <class '__main__.B2'>, <class '__main__.B1'>, <type 'object'>]
现在只有 A1
-A2
分支被初始化 - 而 C.mro()
根本没有改变!
这种行为的原因是什么?
MRO 的打印输出向您展示了这是为什么。 Python 以该特定顺序调用父方法,因此得名。它调用 A2 的方法,该方法有一个超级调用,然后调用 A1 的方法;但是 A1 并没有依次调用 super 所以链停在那里。
好吧,回答我自己的问题:这里详细描述了让我困惑的事情(未能在直接继承形式 object
的 class 中调用 super()
):
让我们使用以下 Python2 代码:
#!/usr/bin/python
class A1(object):
def __init__(self):
super(A1, self).__init__()
print "A1.__init__"
class A2(A1):
def __init__(self):
super(A2, self).__init__()
print "A2.__init__"
class B1(object):
def __init__(self):
super(B1, self).__init__()
print "B1.__init__"
class B2(B1):
def __init__(self):
super(B2, self).__init__()
print "B2.__init__"
class C(A2, B2):
def __init__(self):
super(C, self).__init__()
print "C.__init__"
C()
print C.mro()
即C
继承自两个前身class分支,它们没有共同的祖先(除了默认的object
,不知道这有多重要)。代码输出:
B1.__init__
B2.__init__
A1.__init__
A2.__init__
C.__init__
[<class '__main__.C'>, <class '__main__.A2'>, <class '__main__.A1'>, <class '__main__.B2'>, <class '__main__.B1'>, <type 'object'>]
完全符合预期。
现在说我粗心忘了在A1
和B1
中调用super().__init__()
(我不太关心初始化object
.. .).然后输出变为:
A1.__init__
A2.__init__
C.__init__
[<class '__main__.C'>, <class '__main__.A2'>, <class '__main__.A1'>, <class '__main__.B2'>, <class '__main__.B1'>, <type 'object'>]
现在只有 A1
-A2
分支被初始化 - 而 C.mro()
根本没有改变!
这种行为的原因是什么?
MRO 的打印输出向您展示了这是为什么。 Python 以该特定顺序调用父方法,因此得名。它调用 A2 的方法,该方法有一个超级调用,然后调用 A1 的方法;但是 A1 并没有依次调用 super 所以链停在那里。
好吧,回答我自己的问题:这里详细描述了让我困惑的事情(未能在直接继承形式 object
的 class 中调用 super()
):