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,强调我的)
当我使用 __
创建模块级变量并尝试在 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
, whereclassname
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,强调我的)