web-dev-qa-db-fra.com

Comment appeler la méthode __init__ de la classe de base depuis la classe enfant?

Si j'ai une classe python comme:

class BaseClass(object):
#code and the init function of the base class

Et puis je définis une classe enfant telle que:

class ChildClass(BaseClass):
#here I want to call the init function of the base class

Si la fonction init de la classe de base prend des arguments que je prends comme arguments de la fonction init de la classe enfant, comment puis-je passer ces arguments à la classe de base?

Le code que j'ai écrit est:

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)

Où vais-je mal?

Vous pouvez utiliser 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)

Votre indentation est incorrecte, voici le code modifié:

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__

Voici la sortie:

{'color': 'golden', 'mpg': 10, 'model': 'ford', 'battery_type': 'battery'}
104
Mingyu

Comme Mingyu l'a fait remarquer, le formatage pose problème. Autre que cela, je recommanderais fortement de ne pas utiliser le nom de la classe dérivée lors de l'appel de super(), car cela rend votre code inflexible (maintenance et héritage du code). problèmes). Dans Python 3, utilisez plutôt super().__init__. Voici le code après avoir incorporé ces modifications:

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)

Merci à Erwin Mayer pour avoir signalé le problème lié à l'utilisation de __class__ avec super ()

30
Manjunath Reddy

Vous pouvez appeler le constructeur de la classe comme ça

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

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

b = B()

NOTE:

Cela ne fonctionnera que lorsque la classe parent héritera de object

10
thefourtheye

Si vous utilisez Python 3, il est recommandé d'appeler simplement super () sans aucun argument:

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__

N'appelez pas super avec class , car cela pourrait entraîner des exceptions de récursion infinies conformément à cette réponse .

8
Erwin Mayer