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


где я ошибаюсь?

535   4  

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

    Ничего не найдено.