首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么类方法中所有的双下划线变量都是乱码?

为什么类方法中所有的双下划线变量都是乱码?
EN

Stack Overflow用户
提问于 2019-06-21 08:09:43
回答 2查看 155关注 0票数 3

编辑:目前的两个答案都谈到了类内部存在混乱的事实。我的问题是关于类方法中的值-请注意,方法作用域中的解析不同于类作用域,否则__CLASS将是可打印的。

在Python2.7和3.6中似乎就是这种情况。

例如,下面的代码

代码语言:javascript
复制
__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()

将会给予

代码语言:javascript
复制
local
global name '_Bar__CLASS' is not defined
global name '_Bar__GLOBAL' is not defined
mangled global

我理解当有一个other.__x,或者需要一个类级__foo来等同于self.__foo时的逻辑,但这似乎是一个疏忽,类范围内的任何东西都会被自动重写。

EN

回答 2

Stack Overflow用户

发布于 2019-06-21 09:17:42

这不是一个疏忽。事实上,私有全局变量曾经专门在tutorial中做广告

现在对类私有标识符的支持有限。这种损坏是在不考虑标识符的语法位置的情况下完成的,因此它可以用于定义类私有的实例和类变量、方法、以及全局,甚至可以将这个类私有的实例变量存储在其他类的实例上。

(我检查了提交历史记录,但original commit不包括设计选择的理由。)我们可以推测它是为了实现像私有全局这样的东西,但我们也可以推测以这种方式实现它是最容易的,如果其他选择更容易的话,实现者不会被私有全局的前景所动摇。

票数 3
EN

Stack Overflow用户

发布于 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中的名称都会被损坏,这就是为什么所有双下划线变量在类方法中都被损坏的原因。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56695329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档