Python 使用 __ 对全局变量进行名称修改

Python name mangling on global variable with __

当我使用 __ 创建模块级变量并尝试在 class 的方法(使用 global 关键字)中访问它时,发生了名称重整。

举个例子:

__test = 'asd'  # module level variable with __


class TestClass(object):
    def test(self):
        global __test
        print(__test)  # trying to access this variable


a = TestClass()
a.test()

解释器出现错误:

NameError: name '_TestClass__test' is not defined

正如我们所见,它试图将 __test 命名为 _TestClass__test

我认为名称修改应该只用于 class 变量(当我使用 self 或 class 名称访问它们时)。

这是我没有意识到的明确定义的行为还是某种 Python 错误?

我在 CPython 3.5

上测试过

Any identifier of the form __spam (at least two leading underscores, at most one trailing underscore) is textually replaced with _classname__spam, where classname is the current class name with leading underscore(s) stripped. This mangling is done without regard to the syntactic position of the identifier, as long as it occurs within the definition of a class.

(来自 the Python documentation,强调我的)