149 votes

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

Si j'ai une classe python comme :

class BaseClass(object):
#code et la fonction init de la classe de base

Et ensuite je définis une classe enfant comme :

class ChildClass(BaseClass):
#ici je veux appeler la fonction init de la classe de base

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 passer ces arguments à la classe de base ?

Le code que j'ai écrit est :

class Car(object):
    condition = "nouveau"

    def __init__(self, model, color, mpg):
        self.model = model
        self.color = color
        self.mpg   = mpg

class ElectricCar(Car):
    def __init__(self, type_batterie, model, color, mpg):
        self.type_batterie = type_batterie
        super(ElectricCar, self).__init__(model, color, mpg)

Où est-ce que je me trompe ?

178voto

Mingyu Points 3874

Vous pourriez 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 = "nouveau"

    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('batterie', 'ford', 'doré', 10)
print car.__dict__

Voici la sortie :

{'color': 'doré', 'mpg': 10, 'model': 'ford', 'battery_type': 'batterie'}

83voto

Manjunath Reddy Points 915

Comme l'a souligné Mingyu, il y a un problème de formatage. Mis à part cela, je recommande vivement de ne pas utiliser le nom de la classe dérivée lors de l'appel à super() car cela rend votre code inflexible (problèmes de maintenance du code et d'héritage). En Python 3, utilisez super().__init__ à la place. Voici le code après avoir incorporé ces changements :

class Car(object):
    condition = "nouvelle"

    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 d'avoir souligné le problème d'utilisation de __class__ avec super()

19voto

Erwin Mayer Points 3427

Si vous utilisez Python 3, il est recommandé d'appeler simplement super() sans 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('batterie', 'ford', 'doré', 10)
print car.__dict__

Ne pas appeler super avec class car cela peut entraîner des exceptions de récursion infinie selon cette réponse.

15voto

thefourtheye Points 56958

Vous pouvez appeler le constructeur de la super classe comme ceci

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

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

b = B()

REMARQUE :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X