2015-06-29 2 views
5

Давайте предположим, что у меня есть немного кода Python:Есть ли способ использовать super() для вызова метода __init__ для каждого базового класса в Python?

class Mother: 
    def __init__(self): 
     print("Mother") 

class Father: 
    def __init__(self): 
     print("Father") 

class Daughter(Mother, Father): 
    def __init__(self): 
     print("Daughter") 
     super().__init__() 

d = Daughter() 

Этот скрипт печатает «Дочь». Есть ли способ гарантировать, что все методы __init__ классов классов называются? Один из методов, который я придумал для этого:

class Daughter(Mother, Father): 
    def __init__(self): 
     print("Daughter") 
     for base in type(self).__bases__: 
      base.__init__(self) 

Этот сценарий печатает «Дочь», «Мать», «Отец». Есть ли хороший способ сделать это, используя super() или другой метод?

ответ

5

Raymond Hettinger объясняет это очень хорошо в своей речи Super Considered Super от PyCon 2015. Короткий ответ да, если вы проектируете этот путь, и вызвать super().__init__() в каждом классе

class Mother: 
    def __init__(self): 
     super().__init__() 
     print("Mother") 

class Father: 
    def __init__(self): 
     super().__init__() 
     print("Father") 

class Daughter(Mother, Father): 
    def __init__(self): 
     super().__init__() 
     print("Daughter") 

Название super К сожалению, это действительно прокладывает себе путь через базовые классы.

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