Comment invoquer le super constructeur?

class A:
 def __init__(self):
   print "world"

class B(A):
 def __init__(self):
   print "hello"

B()
hello

dans toutes les autres langues avec lesquelles j'ai travaillé, le super constructeur est invoqué implicitement. Comment fait-on invoquer en Python? Je m'attendais à super(self) mais ça ne marche pas.

251
demandé sur Vadim Kotov 2010-03-08 07:35:17

5 réponses

super() retourne un objet similaire à un parent dans les classes de nouveau style :

class A(object):
    def __init__(self):
        print "world"

class B(A):
    def __init__(self):
        print "hello"
        super(B, self).__init__()

B()
260
répondu Ignacio Vazquez-Abrams 2016-12-26 22:51:58

en ligne avec les autres réponses, il y a plusieurs façons d'appeler les méthodes super class (y compris le constructeur), cependant en Python-3.x le processus a été simplifié:

Python-2.x

class A(object):
 def __init__(self):
   print "world"

class B(A):
 def __init__(self):
   print "hello"
   super(B, self).__init__()

Python-3.x

class A(object):
 def __init__(self):
   print("world")

class B(A):
 def __init__(self):
   print("hello")
   super().__init__()

super() est maintenant équivalent à super(<containing classname>, self) selon le docs .

141
répondu Aidan Gomez 2017-03-17 05:40:15

Avec Python 2.x classes de l'ancien style ce serait:

class A: 
 def __init__(self): 
   print "world" 

class B(A): 
 def __init__(self): 
   print "hello" 
   A.__init__(self)
48
répondu Gabe 2015-07-21 15:59:40

une façon est d'appeler le constructeur de A et passer self comme argument, comme ainsi:

class B(A):
    def __init__(self):
        A.__init__(self)
        print "hello"

L'avantage de ce style est qu'il est très très clair. Il appelle le constructeur de A. L'inconvénient est qu'il ne gère pas très bien l'héritage en forme de diamant, puisque vous pouvez finir par appeler le constructeur de la classe de base partagée deux fois.

une Autre façon est d'utiliser des super(), comme d'autres l'ont montré. Pour seul héritage, il fait la même chose que de vous laisser appeler le parent du constructeur.

cependant, super () est un peu plus compliqué sous le capot et peut parfois être contre-intuitif dans les situations d'héritage multiple. Du côté positif, super() peut être utilisé pour gérer l'héritage en forme de diamant. Si vous voulez connaître les détails de ce que super() fait, la meilleure explication que j'ai trouvé pour comment super () fonctionne est ici (bien que je ne suis pas nécessairement d'accord que l'article de l'avis).

30
répondu Daniel Stutzbach 2013-03-01 23:02:17

j'utilise la formule suivante qui prolonge les réponses précédentes:

class A(object):
 def __init__(self):
   print "world"

class B(A):
 def __init__(self):
   print "hello"
   super(self.__class__, self).__init__()

B()

de cette façon, vous ne devez pas répéter le nom de la classe dans l'appel à super . Il peut être utile si vous codez un grand nombre de classes, et que vous voulez rendre votre code dans les méthodes du constructeur indépendant du nom de la classe.

3
répondu lackadaisical 2015-11-20 10:46:46