Je suis sous Python 2.5, de sorte que cette question ne s'applique pas à Python 3. Lorsque vous effectuez un diamant hiérarchie de classe en utilisant l'héritage multiple et de créer un objet de la plus dérivée de la classe, Python fait la bonne Chose (TM). Il appelle le constructeur de la plus dérivée de la classe, puis de ses classes parentes présentées de gauche à droite, puis la grand-parent. Je suis familier avec Python MRO, ce n'est pas ma question. Je suis curieux de voir comment l'objet renvoyé de super gère réellement à communiquer aux appels de super dans les classes parent le bon ordre. Prenons cet exemple de code:
#!/usr/bin/python
class A(object):
def __init__(self): print "A init"
class B(A):
def __init__(self):
print "B init"
super(B, self).__init__()
class C(A):
def __init__(self):
print "C init"
super(C, self).__init__()
class D(B, C):
def __init__(self):
print "D init"
super(D, self).__init__()
x = D()
Le code ne l'intuitif chose, il imprime:
D init
B init
C init
A init
Cependant, si vous en commentaire l'appel à super pour B de la fonction init, ni Une ni C de la fonction init est appelée. Cela signifie B de l'appel à super est en quelque sorte la conscience du C de l'existence dans l'ensemble de la hiérarchie de classe. Je sais que super retourne un objet proxy avec une surcharge obtenir de l'opérateur, mais comment fait l'objet renvoyé par super en D init définition de communiquer l'existence de C de l'objet renvoyé par super en B init définition? L'information est que les appels ultérieurs de super utiliser stockées sur l'objet lui-même? Si oui, pourquoi n'est-ce pas super au lieu de soi.super?
Edit: Jekke tout à fait raison de rappeler qu'il n'est pas de soi.super parce que super est un attribut de la classe, et non une instance de la classe. Conceptuellement, cela a du sens, mais dans la pratique, super n'est pas un attribut de la classe! Vous pouvez le tester à l'interprète de faire deux classes A et B, où B hérite de A, et en appelant dir(B)
. Il n'a pas d' super
ou __super__
attributs.