为什么使用super()而不是__init __()?

时间:2015-01-09 11:04:44

标签: python class multiple-inheritance superclass

如果我们有类A,定义如下,

class A:
    def __init__(self, x):
        self.x = x

大多数人为什么要使用

class B(A):
    def __init__(self, x, y):
        super().__init__(x)
        self.y = y

而不是

class B(A):
    def __init__(self, x, y):
        A.__init__(self, x)
        self.y = y

?我认为A.__init__(self, x)super().__init__(x)好,因为它支持多重继承(我找不到使用super()的方法):

class A:
    def __init__(self, x):
        self.x = x
class B:
    def __init__(self, y):
        self.y = y
class C(A, B):
    def __init__(self, x, y, z):
        A.__init__(self, x)
        B.__init__(self, y)
        self.z = z

当我尝试在前面的示例中使用super()时,如下所示:

class A:
    def __init__(self, x):
        self.x = x
class B:
    def __init__(self, y):
        self.y = y
class C(A, B):
    def __init__(self, x, y, z):
        super().__init__(self, x)
        super().__init__(self, y)
        self.z = z

班级C没有属性y(请尝试:c = C(1, 2, 3)print(c.y)在下一行。)

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我使用super().__init__(),Python会以正确的顺序自动调用基类的所有构造函数(在第二个示例中首先是A,然后是B构造函数)。

这是Python之美,它可以很好地处理多重继承:)。