Alles wird auf Modulebene ausgeführt, wenn Python zuerst ein Modul importiert. Funktionskörper (und Generatorausdruckskörper) sind hier die Ausnahme , nicht die Regel. Python führt alles aus, um die in einem Modul enthaltenen Objekte zu erstellen. Wie alles in Python sind Klassen Objekte und Funktionen.
Der einzige Grund, warum ein Klassenkörper ein separates Codeobjekt verwendet, liegt darin, dass ein Klassenhauptteil in einem separaten Namespace ausgeführt wird, wobei dieser Namespace dann die Klassenattribute bildet. Klassenkörper sind nicht die einzigen solchen Namespaces; setze und dict comprehensions, und in Python 3 werden Listen-Comprehensions auch mit einem separaten Namespace ausgeführt, wobei ihre Locals definiert werden.
So sind Funktionen und Generatorausdrücke die Ausnahme, ausdrücklich weil ihr ganzer Zweck zu einem späteren Zeitpunkt ausgeführt werden soll. Beachten Sie, dass die Funktion definition ausgeführt wird:
%Vor% Der MAKE_FUNCTION
bytecode erstellt das Funktionsobjekt zusammen mit dem gespeicherten Bytecode für diese Funktion, und das Ergebnis wird an den globalen Namen foo
gebunden.
Klassenobjekte sind hier nicht anders; Die class
-Anweisung erzeugt ein Klassenobjekt, und als Teil dieses Objekts müssen wir die Attribute aus dem Klassenkörper kennen.
Wenn Python nicht den Klassenhauptteil ausgeführt hat, kann anderer Code diese Klassenmitglieder nicht verwenden. Sie konnten nicht auf Klassenattribute (einschließlich Klassenmethoden und statische Methoden) zugreifen, Sie konnten Klassenattribute usw. nicht festlegen
Alle Funktionen, die Teil des Klassenkörpers sind, werden natürlich nicht ausgeführt. Genau wie die Funktionen auf oberster Ebene wird nur ein MAKE_FUNCTION
Bytecode ausgeführt und der resultierende lokale Name (gesetzt mit STORE_FAST
) wird dann in ein Klassenattribut umgewandelt, analog zu einem globalen Funktionsobjekt, das an ein globales mit STORE_NAME
gebunden ist .
Laut Klassendefinitionen - Python-Dokumentation :
Eine Klassendefinition ist eine ausführbare Anweisung. Zuerst wertet sie die Vererbungsliste, falls vorhanden. Jedes Element in der Vererbungsliste sollte zu einem Klassenobjekt oder einem Klassentyp auswerten, was Unterklassenbildung erlaubt. Der Die Klasse der Klasse wird dann in einem neuen Ausführungsrahmen ausgeführt (siehe Abschnitt Benennung und Bindung), mit einem neu erstellten lokalen Namespace und dem ursprünglicher globaler Namespace. (Normalerweise enthält die Suite nur Funktionen Definitionen.) Wenn die Suite der Klasse die Ausführung beendet, wird sie ausgeführt Frame wird verworfen, aber sein lokaler Namespace wird gespeichert. Eine Klasse Objekt wird dann mithilfe der Vererbungsliste für die Basisklassen erstellt und der gespeicherte lokale Namespace für das Attributverzeichnis. Die Klasse name ist an dieses Klassenobjekt im ursprünglichen lokalen Namespace gebunden.
Tags und Links python class python-2.7 python-internals