2010-03-10 5 views
36

Supposons que j'ai une classe Base et une classe Child qui hérite de Base. Quelle est la bonne façon d'appeler le constructeur de la classe de base à partir d'une classe enfant en Python? Est-ce que j'utilise super?Comment appeler correctement les méthodes de classe de base (et le constructeur) à partir de classes héritées en Python?

Voici un exemple de ce que j'ai 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.

+4

Ignacio, je l'ai testé, mais il existe d'autres moyens, par exemple, dans 'Child', je pouvais faire' def __init __ (self, something_else): Base de .__ init __ (value = 20) 'et je ne sais pas si je peux le faire ou non ... C'est pourquoi j'ai demandé à savoir comment le faire absolument correctement et de façon moderne en Python. – bodacydo

Répondre

39

C'est correct. Notez que vous pouvez également appeler la méthode __init__ directement sur la classe Base, comme ceci:

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

C'est la façon dont je le fais en général il. Mais il est découragé, car il ne se comporte pas très bien en présence d'héritages multiples. Bien sûr, l'héritage multiple a toutes sortes d'effets bizarres, et je l'évite comme la peste.

En général, si les classes dont vous héritez utilisent super, vous devez également l'utiliser.

+0

Merci de décrire les deux méthodes. Je n'étais pas sûr de l'un 'Base .__ init__'. – bodacydo

+0

Pouvez-vous ajouter un autre argument autre que "value" à l'exemple? L'ordre est-il important? Et si la valeur est affectée à la valeur? – ragerdl

11

Oui, c'est correct. Si vous voulez être en mesure de passer value dans la classe Child, vous pouvez le faire de cette façon

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

Merci d'avoir illustré comment transmettre la valeur à Child et ensuite cette valeur à Base! – bodacydo

+0

Vous devez également vous assurer que toutes les superclasses de Child peuvent accepter cette valeur et la transmettre, car en général, vous ne pouvez pas être certain que Base est la suivante appelée. –

18

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

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