вызов 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)