2015-07-19 107 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,你不能使用代码访问它们,这就解释了它。 –

相关问题