Il a été noté que dans Python 3.0+ vous pouvez utiliser
super().__init__()
pour effectuer votre appel, ce qui est concis et ne vous oblige pas à référencer explicitement les noms des classes OR parentes, ce qui peut être pratique. Je veux juste ajouter que pour Python 2.7 ou moins, certaines personnes implémentent un comportement insensible au nom en écrivant self.__class__
au lieu du nom de la classe, c'est à dire
super(self.__class__, self).__init__() # DON'T DO THIS!
CEPENDANT, cela interrompt les appels à super
pour toutes les classes qui héritent de votre classe, où self.__class__
pourrait renvoyer une classe enfant. Par exemple :
class Polygon(object):
def __init__(self, id):
self.id = id
class Rectangle(Polygon):
def __init__(self, id, width, height):
super(self.__class__, self).__init__(id)
self.shape = (width, height)
class Square(Rectangle):
pass
Ici, j'ai une classe Square
qui est une sous-classe de Rectangle
. Disons que je ne veux pas écrire un constructeur séparé pour Square
car le constructeur de Rectangle
est suffisant, mais pour une raison quelconque, je veux implémenter un carré pour pouvoir réimplémenter une autre méthode.
Lorsque je crée un Square
en utilisant mSquare = Square('a', 10,10)
Python appelle le constructeur de Rectangle
parce que je n'ai pas donné Square
son propre constructeur. Cependant, dans le constructeur de Rectangle
l'appel super(self.__class__,self)
va retourner la superclasse de mSquare
et appelle donc le constructeur de Rectangle
à nouveau. C'est ainsi que la boucle infinie se produit, comme l'a mentionné @S_C. Dans ce cas, lorsque j'exécute super(...).__init__()
J'appelle le constructeur de Rectangle
mais comme je ne lui donne aucun argument, j'obtiendrai une erreur.
28 votes
Il s'agit d'une introduction très simple aux cours qui vaut la peine d'être suivie : realpython.com/python-super/ . C'est plus facile à digérer que les réponses données qui sont pour la plupart d'entre nous je suppose trop détaillées dans l'implémentation de python. Il comporte également des exemples pour rendre le tout concret.