2010-02-03 80 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"解釋瞭如何創建類。