Python 3 中 super() 的奇怪行为
我知道这个问题之前讨论过很多次,但从来没有人详细解释过背后的原因。
有没有人能详细说明一下,为什么把最后一行代码注释掉会导致错误?我知道 object.__init__ 这个方法不需要任何参数,但为什么当这一行被注释掉时,代码就能正常运行呢?
class A:
def __init__(self, a):
print("A constructor")
super().__init__(a)
self.a = a
print("A constructor end")
class B:
def __init__(self, b):
print("B constructor")
super().__init__()
self.b = b
print("B constructor end")
class C(A, B):
def __init__(self, x):
super().__init__(x)
c = C(42)
#a = A(33)
1 个回答
6
在Python 3中,每个方法都会变成一个闭包,并且会自动添加一个隐藏的值,这个值代表“当前正在定义的类”。你可以通过super()
(不带任何参数)来访问这个值。
super会返回一个对象,这个对象会根据类的方法解析顺序(MRO)来工作。对于C类的实例来说,MRO中是先有A再有B。
如果在MRO中找不到B,那么在A中使用super().__init__
时,会调用object.__init__,而这个方法不能接收任何参数。
你可以通过查看SomeClass.__mro__来查看一个类的MRO。
虽然大部分内容是关于2.x版本的,你可能还想看看这个链接:http://fuhm.net/super-harmful/。