python中多重继承中的super()用法

时间:2017-05-13 16:58:05

标签: python python-3.x super

我是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'

1 个答案:

答案 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,后面是Cobject。从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