Если вы хотите использовать super
в child
для вызова parent.__init__
и parent2._init__
, то оба родителя __init__
s должны также вызвать super
:
class parent(Base):
def __init__(self,x=1,y=2):
super(parent,self).__init__(x,y)
class parent2(Base):
def __init__(self,x=3,y=4):
super(parent2,self).__init__(x,y)
См. "Супер-метод Python и альтернативные вызовы" для более подробной информации о последовательности вызовов __init__
, вызванных использованием super
.
class Base(object):
def __init__(self,*args):
pass
class parent(Base):
var1=1
var2=2
def __init__(self,x=1,y=2):
super(parent,self).__init__(x,y)
self.var1=x
self.var2=y
class parent2(Base):
var4=11
var5=12
def __init__(self,x=3,y=4):
super(parent2,self).__init__(x,y)
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()
Вы можете спросить: «Зачем использовать Base
?». Если parent
и parent2
унаследованы непосредственно от object
, то
super(parent2,self).__init__(x,y)
будет звонить object.__init__(x,y)
. Это поднимает TypeError
, поскольку object.__init__()
не принимает параметров.
Чтобы обойти эту проблему, вы можете создать класс Base
, который принимает аргументы для __init__
, но не передает их object.__init__
. С parent
и parent2
, наследуемыми от Base
, вы избегаете TypeError
.