我有点疑惑为什么在Python中初始化一个类的实例时,我不能使用类属性。这是一个例子:
class TestClass:
... shared_list = ['a', 'b', 'c']
... def __init__(self):
... self.length = len(shared_list)
现在
>>> TestClass.shared_list
['a', 'b', 'c']
因此列表存在于该类的任何实例出现之前,但是
>>> tc = TestClass()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 4, in __init__
NameError: global name 'shared_list' is not defined
我错过了一些简单的东西吗?
UPD:感谢大家的帮助和及时回复。我已经清除了我的困惑:类没有在Python中定义范围。
答案 0 :(得分:3)
w
定义不会为其方法创建新范围,只是局部变量的命名空间。这在Class Definition Syntax中有一定程度的记录:
输入类定义时,会创建一个新的命名空间 用作本地范围 - 因此,所有对局部变量的赋值都会进行 进入这个新命名空间。特别是,函数定义绑定了 这里新功能的名称。
当正常(通过结尾)保留类定义时,类对象 被建造。这基本上是围绕内容的包装器 由类定义创建的命名空间。
这就是为什么你需要在其方法中将class属性引用为class
或TestClass.shared_list
。
答案 1 :(得分:2)
问题出现在__init__
函数中,当您实例化TestClass
时会调用该函数。
__init__
函数使用shared_list
变量,但实际上此变量只能在绑定到实例或基类本身时使用。如果要修改共享变量,则必须使用类名称来调用它:
def __init__(self):
self.length = len(TestClass.shared_list)
如果只想为该实例修改变量,则必须将其声明为实例变量:
def __init__(self):
self.not_shared_list = ['a', 'b', 'c']
self.length = len(self.not_shared_list)
答案 2 :(得分:1)
如果您没有指定&#34;环境&#34;变量shared_list
,这里它是self
或TestClass
,python认为它是一个全局变量 - 也没有定义。
使用self.shared_list
或TestClass.shared_list
来引用它。