Python中的类与实例初始化

时间:2016-09-30 14:07:32

标签: python class oop

我有点疑惑为什么在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中定义范围。

3 个答案:

答案 0 :(得分:3)

w定义不会为其方法创建新范围,只是局部变量的命名空间。这在Class Definition Syntax中有一定程度的记录:

  

输入类定义时,会创建一个新的命名空间   用作本地范围 - 因此,所有对局部变量的赋值都会进行   进入这个新命名空间。特别是,函数定义绑定了   这里新功能的名称。

     

当正常(通过结尾)保留类定义时,类对象   被建造。这基本上是围绕内容的包装器   由类定义创建的命名空间。

这就是为什么你需要在其方法中将class属性引用为classTestClass.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,这里它是selfTestClass,python认为它是一个全局变量 - 也没有定义。

使用self.shared_listTestClass.shared_list来引用它。