编辑:目前的两个答案都谈到了类内部存在混乱的事实。我的问题是关于类方法中的值-请注意,方法作用域中的解析不同于类作用域,否则__CLASS
将是可打印的。
在Python2.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
时的逻辑,但这似乎是一个疏忽,类范围内的任何东西都会被自动重写。
发布于 2019-06-21 09:17:42
这不是一个疏忽。事实上,私有全局变量曾经专门在tutorial中做广告
现在对类私有标识符的支持有限。这种损坏是在不考虑标识符的语法位置的情况下完成的,因此它可以用于定义类私有的实例和类变量、方法、以及全局,甚至可以将这个类私有的实例变量存储在其他类的实例上。
(我检查了提交历史记录,但original commit不包括设计选择的理由。)我们可以推测它是为了实现像私有全局这样的东西,但我们也可以推测以这种方式实现它是最容易的,如果其他选择更容易的话,实现者不会被私有全局的前景所动摇。
发布于 2019-06-21 08:28:53
更新:一开始,我并没有真正回答这个问题,但根据线索,我在最后找到了真正的答案,所以请耐心阅读到最后。简而言之,mangling适用于类中出现的所有名称。
Python类不能具有真正的私有属性,前缀__
用于private
。
我看到了下面的建议:
,但尽量避免使用
__private
的形式。我从来不用它。请相信我。如果你使用它,你和以后会后悔的。
和:
Forms
__private
只是触发了一个新的private name mangling,它的目的是防止在子类中发生意外的命名空间冲突:MyClass.__private
就变成了MyClass._MyClass__private
。
Code Like a Pythonista: Idiomatic Python-naming
我看了一下private name mangling,根据它,在班上所有的names
都可以使用mangling:
私有名称损坏:当一个在类定义中以文本形式出现的标识符名称以两个或更多下划线字符开头,而不是以两个或更多下划线结束时,它被认为是该类的私有名称。
因此,似乎所有出现在class.That中的名称都会被损坏,这就是为什么所有双下划线变量在类方法中都被损坏的原因。
https://stackoverflow.com/questions/56695329
复制相似问题