вызов init для нескольких родительских классов с super? [дубликат]
Возможные Дубликаты:
может ли Super иметь дело с множественным наследованием?
наследование Python? У меня есть структура класса (ниже), и я хочу, чтобы дочерний класс вызывал __init__
обоих родителей. Возможно ли это сделать "супер" способом или это просто ужасная идея?
class Parent1(object):
def __init__(self):
self.var1 = 1
class Parent2(object):
def _init__(self):
self.var2 = 2
class Child(Parent1, Parent2):
def __init__(self):
## call __init__ of Parent1
## call __init__ of Parent2
## super(Child, self).__init__()
3 ответов
вызов через super
не вызывает всех родителей, он вызывает следующую функцию в цепочке MRO. Чтобы это работало правильно, вам нужно использовать super
во всех __init__
s:
class Parent1(object):
def __init__(self):
super(Parent1, self).__init__()
self.var1 = 1
class Parent2(object):
def __init__(self):
super(Parent2, self).__init__()
self.var2 = 2
class Child(Parent1, Parent2):
def __init__(self):
super(Child, self).__init__()
в Python 3, Вы можете использовать super()
вместо super(type, instance)
.
идея super()
это то, что вам не нужно беспокоиться о вызове обоих суперклассов' __init__()
методы отдельно -- super()
позаботится об этом, если вы используете его правильно-см. Раймонд Хеттингер " Python супер () считается супер!" для объяснений.
тем не менее, я часто нахожу недостатки super()
для вызовов конструктора перевешивают преимущества. Например, все ваши конструкторы должны предоставить дополнительный
Вы можете просто позвонить им прямо с Parent.__init__(self)
:
class Parent1(object):
def __init__(self):
self.var1 = 1
class Parent2(object):
def __init__(self):
self.var2 = 2
class Child(Parent1, Parent2):
def __init__(self):
Parent1.__init__(self)
Parent2.__init__(self)
print(self.var1, self.var2)