Подтвердить что ты не робот

Как вызвать метод базового класса __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)

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

4b9b3361

Ответ 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 с классом, так как это может привести к бесконечным исключениям рекурсии в соответствии с этим ответом.