在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 __()方法的情况下调用构造函数?
答案 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)