78 votes

Comment appeler correctement les méthodes (et le constructeur) de la classe de base à partir des classes héritées en Python ?

Supposons que je dispose d'un Base et une classe Child qui hérite de la classe Base . Quelle est la bonne façon d'appeler le constructeur d'une classe de base à partir d'une classe enfant en Python ? Dois-je utiliser super ?

Voici un exemple de ce que j'ai fait jusqu'à présent :

class Base(object):
   def __init__(self, value):
       self.value = value
   ...

class Child(Base):
   def __init__(self, something_else):
       super(Child, self).__init__(value=20)
       self.something_else = something_else
   ...

Est-ce exact ?

Merci, Boda Cydo.

68voto

Chris B. Points 14211

C'est exact. Notez que vous pouvez également appeler la fonction __init__ directement sur la méthode Base comme suit :

class Child(Base):
    def __init__(self, something_else):
        Base.__init__(self, value = 20)
        self.something_else = something_else

C'est ainsi que je procède généralement. Mais elle est déconseillée, car elle ne se comporte pas très bien en présence d'un héritage multiple. Bien sûr, l'héritage multiple a toutes sortes d'effets bizarres, et c'est pourquoi je l'évite comme la peste.

En général, si les classes dont vous héritez utilisent des super vous devez aussi le faire.

64voto

Don O'Donnell Points 1687

Si vous utilisez Python 3.1, super est nouveau et amélioré. Il détermine les arguments de classe et d'instance pour vous. Vous devriez donc appeler super sans arguments :

class Child(Base):
    def __init__(self, value, something_else):
        super().__init__(value)
        self.something_else = something_else
    ...

13voto

gnibbler Points 103484

Oui, c'est exact. Si vous voulez pouvoir passer value dans le Child vous pourriez procéder de la manière suivante

class Child(Base):
   def __init__(self, value, something_else):
       super(Child, self).__init__(value)
       self.something_else = something_else
   ...

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