Python名称在全局变量上与__
当我用Python名称在全局变量上与__,python,cpython,name-mangling,Python,Cpython,Name Mangling,当我用\uuuu创建一个模块级变量并试图在类的方法中访问它时(使用global关键字),出现了名称混乱 让我举一个例子: __test = 'asd' # module level variable with __ class TestClass(object): def test(self): global __test print(__test) # trying to access this variable a = TestClass(
\uuuu
创建一个模块级变量并试图在类的方法中访问它时(使用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()
解释器引发了一个错误:
name错误:未定义名称“\u TestClass\u test”
我们可以看到,它试图将mangle\uuu test
命名为\utestclass\uu test
我认为名称混乱应该只用于类变量(当我使用self
或类名访问它们时)
这是一种我没有意识到的定义良好的行为,还是某种Python bug
我在CPython3.5上测试了它
格式为\u spam
的任何标识符(至少两个前导下划线,
最多一个尾随下划线)以文本形式替换为
\u classname\uu spam
,其中classname
是带前导下划线的当前类名。这种破坏是不加考虑地进行的
到标识符的语法位置,只要它出现
在类的定义中
(来自,emphasis mine)为什么要创建“带有
\uuu
的模块级变量”?请特别注意,正如文档中引用的“这一混乱是在不考虑标识符的语法位置的情况下完成的”实际上是我的一个学生(我在一些初学者级别上教授python)我应该先检查文档:Psee:我认为这是一个bug,因为人们有理由认为,当显式使用global
关键字时,会得到全局变量。即使它记录了它的高度不一致和不合逻辑。@con-f-use这是一个哲学问题,规范中的错误是否是错误。;)我同意可能有更好的方法来避免与子类的名称冲突。我的问题不是真正的名称冲突,而是global
是一个更强的“哲学”概念,因为它在这里有明确的说明。此外,据我所知,global的文档中没有提到在任何地方工作,除了类内变量名以\uuuu
..@con-f开头(但不是结尾)之外。我的意思是,我所看到的名称混乱的唯一目的是避免子类中的名称冲突。