Как вызвать метод init базового класса из дочернего класса? [дубликат]
этот вопрос уже есть ответ здесь:
как вызвать конструктор супер?
5 ответов
Если у меня есть класс 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)
где я ошибаюсь?
4 ответов:
вы могли бы использовать
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'}
как отметил Минью, есть проблема в форматировании. Кроме того, я настоятельно рекомендую не используя имя производного класса во время вызова
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__С Super()
вы можете вызвать конструктор суперкласса вот так
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__Не звоните супер с класс поскольку это может привести к бесконечным исключениям рекурсии согласно ответ.
Comments