我是python的新手。我试图理解python多重继承中的super()
功能。
class B():
def __init__(self):
print("__init__ of B called")
self.b = "B"
class C():
def __init__(self):
print("__init__ of C called")
self.c = "C"
class D(B, C):
def __init__(self):
print("__init__ of D called")
super().__init__()
def output(self):
print(self.b, self.c)
d = D()
d.output()
我收到以下错误:
AttributeError: 'D' object has no attribute 'c'
答案 0 :(得分:6)
super()
会在MRO序列中找到 next方法。这意味着将只调用基类中{em>一个的__init__
方法。
您可以通过查看班级的__mro__
attribute来检查MRO(方法解析订单):
>>> D.__mro__
(<class '__main__.D'>, <class '__main__.B'>, <class '__main__.C'>, <class 'object'>)
所以从D
开始,下一个课程为B
,后面是C
和object
。从D.__init__()
开始,super().__init__()
表达式只会调用B.__init__()
,然后因为C.__init__()
从未调用,self.c
未设置任
您必须向类实现添加更多super()
次调用;在没有参数的情况下调用object.__init__()
是安全的,所以在这里只使用到处:
class B():
def __init__(self):
print("__init__ of B called")
super().__init__()
self.b = "B"
class C():
def __init__(self):
print("__init__ of C called")
super().__init__()
self.c = "C"
class D(B, C):
def __init__(self):
print("__init__ of D called")
super().__init__()
def output(self):
print(self.b, self.c)
现在B.__init__
将调用C.__init__
,C.__init__
将调用object.__init__
,并且调用D().output()
有效:
>>> d = D()
__init__ of D called
__init__ of B called
__init__ of C called
>>> d.output()
B C