2010-02-03 11 views
6

Wenn ich eine Klasse gegen einen lokalen Namespace mache, wie genau funktioniert es? Zum Beispiel:Wie funktionieren Pythons Klassenschließungen?

>>> def foo(): 
...  i = 1 
...  class bar(object): 
...    j = i 
...  return bar 
... 
>>> dis(foo) 
    2   0 LOAD_CONST    1 (1) 
       3 STORE_DEREF    0 (i) 

    3   6 LOAD_CONST    2 ('bar') 
       9 LOAD_GLOBAL    0 (object) 
      12 BUILD_TUPLE    1 
      15 LOAD_CLOSURE    0 (i) 
      18 BUILD_TUPLE    1 
      21 LOAD_CONST    3 (<code object bar at 0xb74f8800, file "<stdin>", line 3>) 
      24 MAKE_CLOSURE    0 
      27 CALL_FUNCTION   0 
      30 BUILD_CLASS   
      31 STORE_FAST    0 (bar) 

    5   34 LOAD_FAST    0 (bar) 
      37 RETURN_VALUE   

Die besondere Linien Ich bin neugierig, diese sind:

   15 LOAD_CLOSURE    0 (i) 
      18 BUILD_TUPLE    1 
      21 LOAD_CONST    3 (<code object bar at 0xb74f8800, file "<stdin>", line 3>) 
      24 MAKE_CLOSURE    0 
      27 CALL_FUNCTION   0 
      30 BUILD_CLASS 

ich die größte Sache annehmen, dass ich mich frage ist, was Funktion gemacht wird und dann genannt? Und ist diese Funktion, wo die Schließungen an die Klasse angeschlossen sind, oder geschieht das anderswo?

Antwort

2

Die ganze Klasse Körper, d.h.

j = i 

ist ein Codeobjekt, das bei 21 versetzt geladen wird und dann bei 27 über CALL_FUNCTION Offset aufgerufen. Das Ergebnis des Aufrufs (der lokale Namespace) wird dann zusammen mit dem Klassennamen und den Basen zum Erstellen der Klasse verwendet. BUILD_CLASS nimmt drei Argumente, ähnlich der type(name, bases, dict) Funktion:

Return ein neuer Typ Objekt. Dies ist im Wesentlichen eine dynamische Form der Klassenanweisung. Die Namenszeichenfolge ist der Klassenname und wird Name Attribut; das Basistupel ordnet die Basisklassen auf und wird zum Bases Attribut; und das dict-Wörterbuch ist der Namespace, der die Definitionen für den Klassenkörper enthält, und wird zum dict-Attribut.

Es gibt auch einen sehr detaillierten Artikel "Notes on the Python Class Statement", der erklärt, wie Klassenerstellung funktioniert.

Verwandte Themen