Forum Programmation.python Appeler le constructeur de la superclasse ou non ?

Posté par  (site web personnel) .
Étiquettes : aucune
0
29
juil.
2005
Bonjour,

j'ai une petite question toute bête concernant python.

Supposons une classe Pouet héritant de Prout.

J'aurai plutot tendance a mettre dans sa methode __init__ un appel a la methode __init__ de Prout

Sauf que dans mon python (2.4), je viens de m'aperçevoir que c'est réaliser de manière automatique !

Et là je m'interroge, est-ce donc inutile d'appeler le constructeur de la superclasse ?

J'ai googlisé un peu et j'suis tombé la dessus, http://fr.diveintopython.org/fileinfo_class.html(...)

Petit extrait choisi :
Certain langage pseudo-orientés objet comme Powerbuilder ont un concept d’“extension” des constructeurs et autres évènements, dans lequel la méthode de l’ancêtre est appelée automatiquement avant que la méthode du descendant soit exécutée. Python n’a pas ce comportement, vous devez appeler la méthode appropriée de l’ancêtre explicitement

le tout illustré par
class FileInfo(UserDict):
"store file metadata"
def __init__(self, filename=None):
UserDict.__init__(self) 1
self["name"] = filename


Alors docteur ?
  • # Contre exemple

    Posté par  . Évalué à 4.

    Il est nécessaire d'appeler le constructeur de la classe parente...
    Démonstration : 
    In [1]: class base: 
       .1.:   def __init__ (self): 
       .1.:     print "Constructeur - base" 
       .1.:     self.based = True 
       .1.: 
     
    In [2]: class derived(base): 
       .2.:   def __init__ (self): 
       .2.:     print "Constructeur - derived" 
       .2.:     self.derived = True 
       .2.: 
     
    In [3]: a = derived() 
    Constructeur - derived 
     
    In [4]: 
     
    • [^] # Re: Contre exemple

      Posté par  (site web personnel) . Évalué à 2.

      Bon en fait j'ai saisi la nuance, la règle est donc la suivante :
      "Si la classe dérivée a son propre constructeur, alors le constructeur de la classe mère n'est pas appelé automatiquement."

      Merci !
      • [^] # Re: Contre exemple

        Posté par  . Évalué à 2.

        ... et de manière plus générale : redéfinir une méthode dans une classe dérivée fait que la méthode correspondante de la classe mère n'est pas exécutée implicitement. Un appel explicite est néanmoins toujours possible, bien sûr.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.