当我使用__
创建模块级变量并尝试在类的方法(使用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
。
我认为名称修改应仅用于类变量(当我使用self
或类名称访问它们时。)
这是一个我没有意识到的明确定义的行为,还是某种Python错误?
我在CPython 3.5上测试了它
答案 0 :(得分:2)
__spam
形式的任何标识符(至少两个主要下划线, 最多一个尾随下划线)在文本上被替换为_classname__spam
,其中classname
是当前的类名,前导下划线被剥离。这次破坏完成,不考虑 到标识符的句法位置,只要它发生 在一个类的定义内。
(来自the Python documentation,强调我的)