Warum wird der Körper einer Klasse zur Definitionszeit ausgeführt?

9

Im Gegensatz zu Funktionen wird der Body einer Klasse zur Definitionszeit ausgeführt:

%Vor%

Aus:

%Vor%

Warum ist das so? Handelt es sich um @classmethod / @staticmethod Methoden und Klassenattribute?

    
usual me 04.10.2014, 14:13
quelle

2 Antworten

14

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 .

    
Martijn Pieters 04.10.2014, 16:24
quelle
7

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.

    
falsetru 04.10.2014 14:17
quelle