关于多父继承,当我调用super
.__init__
时,为什么不调用parent2的__init__
函数?谢谢。
class parent(object):
var1=1
var2=2
def __init__(self,x=1,y=2):
self.var1=x
self.var2=y
class parent2(object):
var4=11
var5=12
def __init__(self,x=3,y=4):
self.var4=x
self.var5=y
def parprint(self):
print self.var4
print self.var5
class child(parent, parent2):
var3=5
def __init__(self,x,y):
super(child, self).__init__(x,y)
childobject = child(9,10)
print childobject.var1
print childobject.var2
print childobject.var3
childobject.parprint()
输出为
9
10
5
11
12
因为
parent
是method resolution order (MRO)中的下一个,它从不使用super()
调用parent2
。请参见以下示例:
这将输出:
Python多重继承就像一个链,在
Child
类mro
中,ParentA
的super
类是ParentB
,因此需要调用super().__init__()
中的ParentA
来初始化ParentB
。如果将
super().__init__('ParentA')
更改为Base.__init__(self, 'ParentA')
,这将断开继承链,输出:有关MRO的详细信息
如果要使用
child
中的super
调用parent.__init__
和parent2._init__
,则父级__init__
也必须调用super
:有关使用
super
引起的对__init__
的调用序列的更多详细信息,请参见"Python super method and calling alternatives"。你可能会想,“为什么要使用
Base
?”。如果parent
和parent2
直接从object
继承,那么super(parent2,self).__init__(x,y)
将调用object.__init__(x,y)
。这会引发一个TypeError
,因为object.__init__()
不需要参数。要解决此问题,可以创建一个类
Base
,该类接受__init__
的参数,但不将它们传递给object.__init__
。当从Base
继承parent
和parent2
时,可以避免TypeError
。相关问题 更多 >
编程相关推荐