2015-01-09 1 views
0

Если мы класс A, определяется следующим образом,Зачем использовать super() вместо __init __()?

class A: 
    def __init__(self, x): 
     self.x = x 

почему большинство людей используют

class B(A): 
    def __init__(self, x, y): 
     super().__init__(x) 
     self.y = y 

вместо

class B(A): 
    def __init__(self, x, y): 
     A.__init__(self, x) 
     self.y = y 

? Я думаю, что A.__init__(self, x) лучше тогда super().__init__(x), поскольку он поддерживает множественное наследование (и я не нашел способ сделать это с super()):

class A: 
    def __init__(self, x): 
     self.x = x 
class B: 
    def __init__(self, y): 
     self.y = y 
class C(A, B): 
    def __init__(self, x, y, z): 
     A.__init__(self, x) 
     B.__init__(self, y) 
     self.z = z 

Когда я пытаюсь использовать super() в предыдущем примере, как это :

class A: 
    def __init__(self, x): 
     self.x = x 
class B: 
    def __init__(self, y): 
     self.y = y 
class C(A, B): 
    def __init__(self, x, y, z): 
     super().__init__(self, x) 
     super().__init__(self, y) 
     self.z = z 

класс C не имеет атрибут y (попробуйте: c = C(1, 2, 3) и print(c.y) в следующей строке).

Что я делаю неправильно?

+0

'супер' является ** именно для ** множественного наследования, поэтому вам не нужно явно вызывать метод на всех отдельных суперклассах. – jonrsharpe

ответ

0

Я использую super().__init__(), Python автоматически вызовет все конструкторы ваших базовых классов самостоятельно в правильном порядке (в вашем втором примере сначала A, затем B конструкторы).

Это одна из красот Python, она красиво обрабатывает многократное наследование :).

 Смежные вопросы

  • Нет связанных вопросов^_^