Как вызвать метод базового класса __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)
Где я иду не так?
Ответы
Ответ 1
Вы можете использовать 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'}
Ответ 2
Как отметил Минью, в форматировании есть проблема. Кроме этого, я настоятельно рекомендую не использовать имя класса 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__
с помощью функции super()
Ответ 3
Вы можете вызвать конструктор суперкласса, подобный этому
class A(object):
def __init__(self, number):
print "parent", number
class B(A):
def __init__(self):
super(B, self).__init__(5)
b = B()
Примечание:
Это будет работать только тогда, когда родительский класс наследует object
Ответ 4
Если вы используете 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__
Не вызывайте super с классом, так как это может привести к бесконечным исключениям рекурсии в соответствии с этим ответом.