使用__

时间:2016-11-30 07:59:28

标签: python cpython name-mangling

当我使用__创建模块级变量并尝试在类的方法(使用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上测试了它

1 个答案:

答案 0 :(得分:2)

  

__spam形式的任何标识符(至少两个主要下划线,   最多一个尾随下划线)在文本上被替换为   _classname__spam,其中classname是当前的类名,前导下划线被剥离。这次破坏完成,不考虑   到标识符的句法位置,只要它发生   在一个类的定义内。

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