Si la classe est appelée, pourquoi le constructeur n'est pas imprimé de la déclaration. Si la classe n'est pas appelée, alors pourquoi cette déclaration d'impression est fonctionnée? Les deux fois, nous appelons la fonction d'impression extérieure mais une seule fois fonctionne uniquement?
exemple.py p> sortie: p>
3 Réponses :
Si vous exécutez ceci dans la console, c'est apparent. Avant de redéfinir def extérieur code> écrasé classe externe code> dans la portée que vous avez définie ici. "Imprimer" CODE> est imprimé car il s'appelle dans la définition de la classe de externe code> mais pas em> dans le constructeur. Vous avez appelé la fonction em> externe (deux fois) et que vous n'aviez jamais instancié la classe em> externe code> car il n'existe plus. P >
extérieur code> en fonction, l'instruction impression code> dans la définition de la classe est exécutée: p>
Il existe deux scopes différentes ici - une pièce similaire à l'aide de la portée du module au lieu de la portée de la classe:
outer = class:
print("Creating class outer")
# ... etc. ...
outer = def(msg):
# you get the idea
de la documentation: p>
En pratique, les déclarations à l'intérieur d'une définition de classe seront généralement des définitions de fonction, mais d'autres déclarations sont autorisées et parfois utiles [...] p>
blockQuote>
https://docs.python.org/3 /Tutorial/classes.html#Class-Definition-Syntax p> Imprimer ("Imprimer") CODE> est exécuté lorsque la classe est définie, pas lorsqu'elle est initialisée.
def extérieur (msg): ... code> remplace ensuite la définition de la classe. Par conséquent, __ init __ code> n'est jamais appelé. P>
def extérieur code> écraseclasse externe code> dans la portée que vous avez définie ici."Imprimer" CODE> est imprimé car il est appelé dans la définition de la classe declasse extérieure code> mais pas i> dans le constructeur. Vous avez appelé la fonction i> externe (deux fois), et vous n'avez jamais instancié la classe i>externe code> car il n'existe plus.Que
impression ("print") code> est exécuté lors de l'importation de module.Essayez
Imprimer (type (externe)) code>