2017-03-15 2 views
-1

code:classe de base restent les mêmes si la base pointe vers un autre

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


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

Base = ChildB 
Base() 

Quand je fais Base = ChildB, Base, dans le cadre global, les points à ChildB qui prolonge la Base précédente. Puisque python est un langage dynamiquement typé, je suppose que la relation hiérarchique va changer. Et MRO cette référence super sera ChildB > Base(ChildB) > ChildB > Base(ChildB) ....

Mais le résultat dit la vérité que ChildB étend toujours la base d'origine. Pourquoi ???

+0

On ne sait pas vraiment ce que vous essayez de faire? –

+0

Vous pouvez trouver cet article utile: [Faits et mythes sur les noms et les valeurs de Python] (http://nedbatchelder.com/text/names.html), qui a été écrit par SO vétéran Ned Batchelder. Voir aussi [D'autres langages ont des "variables", Python a des "noms"] (http://python.net/~goodger/projects/pycon/2007/idiomatic/handout.html#other-languages-have-variables) pour un bref résumé avec de beaux diagrammes. –

+0

@ xiº C'est ma question sur la réponse de SC à [Comprendre Python super() avec les méthodes __init __() ] (http://stackoverflow.com/questions/576169/understanding-python-super-with-init-methods) – MMMMMCCLXXVII

Répondre

1

Ne confondez pas la classe dont le nom est Base avec la variable Python Base qui a initialement saisi.

>>> class Base(object): pass 
... 
>>> class ChildBase(Base): pass 
... 
>>> Base = ChildBase 
>>> Base.__name__ 
'ChildBase' 

Lorsque ChildBase est défini, le nom Base est toujours lié à la classe Base, de sorte que la classe est mère de ChildBase, quel que soit le nom Base est ensuite lié.

Une déclaration de classe est comme class Base(object): pass équivaut à un appel à type:

Base = type('Base', (object,), {}) 

L'identifiant Base est utilisé aussi bien pour le nom de la classe et la variable liée à l'objet résultant.