编辑:现有的回答都谈到了类内部存在名称修饰的事实。我的问题是关于类方法内的值——请注意,方法内的解析与类范围内的解析不同,否则__CLASS
将会被打印。
这在Python 2.7和3.6中似乎是个问题。
例如,以下代码:
__GLOBAL = 'global'
_Bar__MANGLED_GLOBAL = 'mangled global'
class Bar(object):
__CLASS = 'class'
def baz(self):
__LOCAL = 'local'
try:
print __LOCAL
except Exception as e:
print e
try:
print __CLASS
except Exception as e:
print e
try:
print __GLOBAL
except Exception as e:
print e
try:
print __MANGLED_GLOBAL
except Exception as e:
print e
Bar().baz()
我会提供
local
global name '_Bar__CLASS' is not defined
global name '_Bar__GLOBAL' is not defined
mangled global
我理解当存在other.__x
或需要一个类级别的__foo
与self.__foo
相等时的逻辑,但这似乎是一种疏忽,因为在类范围内的任何内容都会自动重写。
x.__foo
中的x
是否是当前类的实例。__FOO
明显不是属性查找,因为没有涉及到.
。这样的名称是否可能引用与属性相同的对象并不重要,因为名称改编旨在避免覆盖继承的属性。局部变量不受继承影响。 - chepner