2013-10-06 5 views
58

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

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 для дочернего класса, как передать эти аргументы базовому классу?

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

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) 

Где я буду неправильно?

+0

Ваш формат неправильный, это проблема с копированием и вставкой? Python будет лаять в неправильном формате. – Mingyu

+0

@ Формат Mingyu неверен? Вы имеете в виду отступы или я пропущу что-то еще здесь? –

+0

Да .. Я имею в виду отступы. Пожалуйста, посмотрите мой ответ ниже. – Mingyu

ответ

73

Вы можете использовать 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'} 
+1

Если вы передадите 'BaseClass' в' super', он пропустит 'BaseClass' и вызовет' object .__ init__', что почти наверняка не то, что вы хотите. – abarnert

+1

Между тем, единственное, что неправильно с кодом OP, - это его отступ, объясняющий «супер» (даже если вы объяснили это правильно, а это не так) не помогает, особенно учитывая, что он уже использовал его точно так же; на самом деле, он характерен для персонажа. – abarnert

+2

Спасибо, @abarnert. Первоначально он не размещал свой код, и вопрос, который он задал, - это тот, который указан в названии. – Mingyu

7

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

class A(object): 
    def __init__(self, number): 
     print "parent", number 

class B(A): 
    def __init__(self): 
     super(B, self).__init__(5) 

b = B() 

ПРИМЕЧАНИЕ:

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

18

Как Mingyu отметил, существует проблема в форматировании. Кроме этого, я настоятельно рекомендую не использовать имя класса 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__ с супер()

+2

Можете ли вы дать какое-либо объяснение рекомендации «не использовать имя производного класса»? – jwg

+0

@jwg Я обновил ответ, чтобы объяснить, почему __class__ - лучший выбор. –

+2

@CraigFinch, похоже, не совсем хорошая идея использовать self .__ class__. В Python 3 вы можете просто использовать super() .__ init__ –

6

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

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__ 

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

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