假设我定义了以下四个类:
(该代码已在Python 3.6.5上进行了测试。然而,我预计它也可以在Python 2.7.x上使用“from __future__ import print_function”正常工作)
请注意以下两点:
我们可以看到,
是什么造成了
谢谢您的帮助。
(该代码已在Python 3.6.5上进行了测试。然而,我预计它也可以在Python 2.7.x上使用“from __future__ import print_function”正常工作)
In [1]: class A(object):
...: pass
...:
...: class B(object):
...: def __init__(self, value):
...: print('B(value=%s)' % value)
...:
...: class C(A):
...: def __init__(self, value):
...: print('C(value=%s)' % value)
...: super(C, self).__init__(value)
...:
...: class D(A, B):
...: def __init__(self, value):
...: print('D(value=%s)' % value)
...: super(D, self).__init__(value)
...:
In [2]: C.mro()
Out[2]: [__main__.C, __main__.A, object]
In [3]: D.mro()
Out[3]: [__main__.D, __main__.A, __main__.B, object]
请注意以下两点:
没有
__init__
方法的class A
;根据 mro 信息,C 和 D 都有相同的后继类
A
。
因此我认为 super(C, self).__init__(value)
和 super(D, self).__init__(value)
都会触发在 A
中定义的 __init__
方法。
然而,下面的结果让我非常困惑!
In [4]: C(0)
C(value=0)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-4-75d9b7f7d447> in <module>()
----> 1 C(0)
<ipython-input-1-5252938615c6> in __init__(self, value)
9 def __init__(self, value):
10 print('C(value=%s)' % value)
---> 11 super(C, self).__init__(value)
12
13 class D(A, B):
TypeError: object.__init__() takes no parameters
In [5]: D(1)
D(value=1)
B(value=1)
Out[5]: <__main__.D at 0x2a6e8755b70
我们可以看到,
class D
的初始化成功了,而class C
失败了。是什么造成了
class C
和class D
之间的不同行为呢?
编辑:我认为我的问题不是关于mro(实际上我对python的mro多少有些了解),我的问题是关于__init___
方法的不同行为。
编辑2:我太傻了,是mro的问题。谢谢您的帮助。