Как вызвать метод __init__ базового класса из дочернего класса?

Если у меня есть класс python:

class BaseClass(object): #code and the init function of the base class 

И затем я определяю дочерний класс, например:

 class ChildClass(BaseClass): #here I want to call the init function of the base class 

Если функция init базового класса принимает некоторые аргументы, которые я принимаю в качестве аргументов функции init для дочернего класса, как передать эти аргументы базовому классу?

Код, который я написал, это:

 class Car(object): condition = "new" def __init__(self, model, color, mpg): self.model = model self.color = color self.mpg = mpg class ElectricCar(Car): def __init__(self, battery_type, model, color, mpg): self.battery_type=battery_type super(ElectricCar, self).__init__(model, color, mpg) 

Где я иду не так?

  • Список Python для вложенных ключей
  • Чтение файла с тайм-аутом в Python
  • Любой способ правильно напечатать упорядоченные словари?
  • Как распечатать из сценария Python 2.7, вызывается из Bash в PyCharm?
  • Как читать входы как целые числа?
  • OverflowError Python int слишком большой, чтобы преобразовать в C long
  • Итерация python Enum в порядке определения
  • python `print` не работает в цикле
  • 4 Solutions collect form web for “Как вызвать метод __init__ базового класса из дочернего класса?”

    Вы можете использовать super(ChildClass, self).__init__()

     class BaseClass(object): def __init__(self, *args, **kwargs): pass class ChildClass(BaseClass): def __init__(self, *args, **kwargs): super(ChildClass, self).__init__(*args, **kwargs) 

    Ваш отступ неверен, вот модифицированный код:

     class Car(object): condition = "new" def __init__(self, model, color, mpg): self.model = model self.color = color self.mpg = mpg class ElectricCar(Car): def __init__(self, battery_type, model, color, mpg): self.battery_type=battery_type super(ElectricCar, self).__init__(model, color, mpg) car = ElectricCar('battery', 'ford', 'golden', 10) print car.__dict__ 

    Вот результат:

     {'color': 'golden', 'mpg': 10, 'model': 'ford', 'battery_type': 'battery'} 

    Как отметил Мингью, в форматировании существует проблема. Кроме этого, я настоятельно рекомендую не использовать имя класса Derived при вызове super() поскольку он делает ваш код негибким (вопросы обслуживания кода и наследования). В Python 3 вместо этого используйте super().__init__ . Вот код после включения этих изменений:

     class Car(object): condition = "new" def __init__(self, model, color, mpg): self.model = model self.color = color self.mpg = mpg class ElectricCar(Car): def __init__(self, battery_type, model, color, mpg): self.battery_type=battery_type super().__init__(model, color, mpg) 

    Спасибо Эрвин Майер за то, что он указал на проблему с использованием __class__ с супер ()

    Вы можете вызвать конструктор суперкласса, как это

     class A(object): def __init__(self, number): print "parent", number class B(A): def __init__(self): super(B, self).__init__(5) b = B() 

    ЗАМЕТКА:

    Это будет работать только тогда, когда родительский класс наследует object

    Если вы используете Python 3, рекомендуется просто вызвать super () без каких-либо аргументов:

     class Car(object): condition = "new" def __init__(self, model, color, mpg): self.model = model self.color = color self.mpg = mpg class ElectricCar(Car): def __init__(self, battery_type, model, color, mpg): self.battery_type=battery_type super().__init__(model, color, mpg) car = ElectricCar('battery', 'ford', 'golden', 10) print car.__dict__ 

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

    Python - лучший язык программирования в мире.