Comprendre les méthodes Python super() et __init__()

J'essaie de comprendre l'utilisation de super(). D'après ce que je vois, les deux classes enfant peuvent être créées, sans problème.

Je suis curieux de savoir quelle est la différence réelle entre les deux classes enfant suivantes.

class Base(object):
    def __init__(self):
        print "Base created"

class ChildA(Base):
    def __init__(self):
        Base.__init__(self)

class ChildB(Base):
    def __init__(self):
        super(ChildB, self).__init__()

ChildA() 
ChildB()
Solution

super() vous permet d'éviter de faire référence à la classe de base explicitement, ce qui peut être agréable. Mais le principal avantage vient de l'héritage multiple, où toutes sortes de [choses amusantes][1] peuvent se produire. Consultez la [documentation standard sur super][2] si vous ne l'avez pas déjà fait.

Notez que [la syntaxe a changé dans Python 3.0][3] : vous pouvez simplement dire super().__init__() au lieu de super(ChildB, self).__init__(), ce qui, selon moi, est beaucoup plus agréable. La documentation standard fait également référence à un [guide to using super()] (https://rhettinger.wordpress.com/2011/05/26/super-considered-super/) qui est assez explicatif.

[1] : http://www.artima.com/weblogs/viewpost.jsp?thread=236275 [2] : https://docs.python.org/2/library/functions.html#super [3] : https://docs.python.org/3/library/functions.html#super

Commentaires (5)

Juste une info... avec Python 2.7, et je crois depuis que super() a été introduit dans la version 2.2, vous ne pouvez appeler super() que si l'un des parents hérite d'une classe qui hérite éventuellement de object (new-style classes).

Personnellement, pour ce qui est du code python 2.7, je vais continuer à utiliser BaseClassName.__init__(self, args) jusqu'à ce que j'obtienne réellement l'avantage d'utiliser super().

Commentaires (2)

Il n'y en a pas vraiment. super() regarde la classe suivante dans le MRO (method resolution order, accessible avec cls.__mro__) pour appeler les méthodes. Le simple fait d'appeler la base __init__ appelle la base __init__. Il se trouve que le MRO a exactement un élément - la base. Vous faites donc exactement la même chose, mais d'une manière plus agréable avec super() (en particulier si vous abordez l'héritage multiple plus tard).

Commentaires (6)