Python 中的类初始化与实例初始化

Laz*_*Cat 5 python oop class

我有点困惑为什么在Python中初始化类的实例时,我不能使用类属性。这是示例:

class TestClass:
... shared_list = ['a', 'b', 'c']
... def __init__(self):
...     self.length = len(shared_list)
Run Code Online (Sandbox Code Playgroud)

现在

>>> TestClass.shared_list
['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)

因此该列表在类的任何实例出现之前就存在,但是

>>> 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
Run Code Online (Sandbox Code Playgroud)

我错过了一些简单的事情吗?

UPD:感谢大家的帮助和及时回复。我已经消除了我的困惑:类在 Python 中没有定义作用域。

Eug*_*ash 3

定义class不会为其方法创建新的作用域,而只是为局部变量创建一个命名空间。这在某种程度上记录在类定义语法中:

\n\n
\n

输入类定义时,将创建一个新的命名空间,并将其用作本地作用域 \xe2\x80\x94,因此,对本地变量的所有赋值都将进入此新命名空间。特别是,函数定义在此处绑定新函数的名称。

\n\n

当正常保留类定义时(通过末尾),将创建一个类对象。这基本上是类定义创建的命名空间内容的包装。

\n
\n\n

这就是为什么您需要将类属性作为其方法TestClass.shared_listself.shared_list在其方法中引用。

\n