构造函数在继承的类python中失败

时间:2016-06-21 08:04:40

标签: python python-2.7

在python中调用继承类中构造函数的正确方法是什么?

例如,

class A:

    def __init__(self, x, y):
        self.x = x
        self.y = y


class B(A):

    def __init__(self, x, y, z):
        self.z = z
        # super().__init__(x, y) # <== works
        super(x, y) # <== throws TypeError: must be type, not int

a = A(2, 3)
b = B(2, 3, 4)

是否可以在不调用基类的 __ init __()方法的情况下调用构造函数?

2 个答案:

答案 0 :(得分:3)

您使用的是super()错误;你需要创建传递当前类和self的对象,然后在其上引用一个继承的属性:

super(B, self).__init__(x, y)

super()然后使用type(self).__mro__在方法解析顺序(MRO)中搜索完整的继承树,从B之后的下一个位置开始,以查找所需的属性。在这里,您正在寻找__init__,因此type(B).__mro__首先搜索B,然后从下一个条目开始,搜索__init__属性,然后绑定到self 1}}给你。您最终会以这种方式拨打A.__init__(self, x, y)

请注意,super()可用于在MRO中查找任何继承的属性,它不仅有助于查找当前方法的基本实现。

super()只能在新式类中使用,这意味着在Python 2中,必须使用object启动继承树:

class A(object):

object自动成为Python 3中继承树的一部分。

答案 1 :(得分:2)

这样做:

super(B, self).__init__(x, y)