我希望拥有一个由类的所有实例共享并可访问的属性。
示例代码:
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:未定义名称“代码”
如果我将带有code
和code2d
的行放入init方法,那么一切都正常。
为什么此代码会抛出错误?
答案 0 :(得分:2)
code
是一个类变量,因此在访问它时您需要调用 - Test.code
,您无法使用code
访问它们。
此外,即使您使用Test.code
访问它们,它仍然无效,因为在定义类时会计算类变量的值(默认值),因此当您尝试访问{时{1}},您将无法访问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__()
和code
,那么你不需要它们作为类变量,你应该创建实例变量as-
code2d
如果您真的希望>>> 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) ]
和code
成为类变量,那么一种方法是在类code2d
之外定义code2d
,例如 -
Test