2010-02-03 19 views
6

Si hago una clase contra un espacio de nombre local, ¿cómo funciona exactamente? Por ejemplo:¿Cómo funcionan los cierres de clase de Python?

>>> 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   

Las líneas particulares Tengo curiosidad acerca de estos son:

   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 

supongo que lo más grande que me pregunto es qué función se está realizando y entonces llamado? ¿Y es esta función donde los cierres están unidos a la clase, o sucede eso en otro lugar?

Respuesta

2

El cuerpo de la clase entera, es decir

j = i 

es un objeto de código, que se carga en el offset 21 y luego invoca en el desplazamiento 27 a través de CALL_FUNCTION. El resultado de la invocación (el espacio de nombres local) se usa junto con el nombre de la clase y las bases para crear la clase. BUILD_CLASS toma tres argumentos, similar a la función type(name, bases, dict):

Devuelve un nuevo tipo de objeto. Esta es esencialmente una forma dinámica de la declaración de clase. El nombre de la cadena es el nombre de la clase y se convierte en el atributo ; la tupla de bases detalla las clases base y se convierte en el atributo bases; y el diccionario dict es el espacio de nombres que contiene las definiciones para el cuerpo de la clase y se convierte en el dict atributo.

También hay un artículo muy detallado "Notes on the Python Class Statement" que explica cómo funciona la creación de clases.

Cuestiones relacionadas