2015-07-19 109 views
2

我想擁有一個由一個類的所有實例共享和訪問的屬性。爲什麼這個Python代碼會出現名稱錯誤?

示例代碼:

class Test: 

    code = [ 1, 2, 3, 5, 6, 7, 8, 9, 10] 
    code2d = [ [ code[j*3 + i] for i in range(3) ] for j in range(3) ] 

    def __init__(self): 
     pass 

不過,我得到錯誤:

NameError: name 'code' is not defined

如果我把線與codecode2d到init方法,所有工作正常。

爲什麼這段代碼會拋出錯誤?

+0

發佈完整的代碼。 –

+0

你真的想要代碼和code2d是類變量嗎? –

+0

是的,我需要code2d。然而,這是示例代碼,真正的代碼更復雜,我需要利用嵌套的列表理解。 – hakubaa

回答

2

code是一個類變量,因此在訪問它時需要調用 - Test.code,因此無法使用code訪問它們。

此外,即使您使用Test.code訪問它們,它仍然不起作用,因爲在定義類時會計算類變量的值(默認值),所以當您嘗試訪問Test.code時,由於尚未創建,因此無法訪問Test。的那個例子 -

>>> class Test: 
...  code = [ 1, 2, 3, 5, 6, 7, 8, 9, 10] 
...  code2d = [ [ Test.code[j*3 + i] for i in range(3) ] for j in range(3) ] 
...  def __init__(self): 
...   pass 
... 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 3, in Test 
    File "<stdin>", line 3, in <listcomp> 
    File "<stdin>", line 3, in <listcomp> 
NameError: name 'Test' is not defined 

,當你把它們放在__init__()你是把他們作爲我猜 -

類測試:

def __init__(self): 
    code = [ 1, 2, 3, 5, 6, 7, 8, 9, 10] 
    code2d = [ [ code[j*3 + i] for i in range(3) ] for j in range(3) ] 

這工作,因爲code這裏是一個local variable,因此可以接受__init__()方法中的其他局部變量,儘管它們在該函數之外不可訪問。


也許,你並不需要他們爲類變量,如果你想擁有的類的所有實例(類的對象)codecode2d,您應該創建實例變量原樣

>>> class Test: 
...  def __init__(self): 
...   self.code = [ 1, 2, 3, 5, 6, 7, 8, 9, 10] 
...   self.code2d = [ [ self.code[j*3 + i] for i in range(3) ] for j in range(3) ] 

如果你真的想codecode2d是類變量,做一個方式,它是定義code2d類012外,example -

class Test: 
    code = [ 1, 2, 3, 5, 6, 7, 8, 9, 10] 
    def __init__(self): 
     pass 


Test.code2d = [ [ Test.code[j*3 + i] for i in range(3) ] for j in range(3) ] 
+0

*如果我將'code'和'code2d'這兩行放入init方法中,所有工作都正常。我不明白爲什麼這段代碼會拋出錯誤。*你沒有解釋爲什麼在類體中使用它時不起作用; OP *已經知道它在你將它放入'__init__'方法的時候起作用。 –

+0

@MartijnPieters補充說,根據猜測,雖然他沒有把它的工作代碼,所以我沒有把這種情況。 –

+0

@MartijnPieters我在開始時說過 - '代碼是一個類變量,因此當訪問它時,你需要調用--Test.code,你不能使用代碼訪問它們,這就解釋了它。 –

相關問題