2010-02-03 79 views
6

如果我针对本地命名空间创建类,它究竟如何工作?例如: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   

的特定行我好奇的是这些:

   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 

我想,我不知道是被进行了哪些功能,然后叫最重要的事情?这个功能是封闭式的,还是在其他地方发生的?

回答

2

整个类体,即

j = i 

是一个代码对象,它被加载在偏移21,然后调用在经由CALL_FUNCTION偏移27。调用的结果(局部命名空间)随后与类名和基础一起用于创建类。 BUILD_CLASS需要三个参数,类似于type(name, bases, dict)函数:

返回一个新的类型对象。这实质上是类声明的一种动态形式。名称字符串是类名称,并且变为名称属性;基本元组逐项列出基类,并成为基的属性;而字典字典是包含类体的定义的名称空间,并成为字典属性。

还有一篇非常详细的文章"Notes on the Python Class Statement"解释了如何创建类。