繁体   English   中英

python 名称修改和全局变量

[英]python name mangling and global variables

#global variable
_test__x=13

class test:
    def __init__(self,x):
        self.__x=x
    def rex(self):
        return __x

d = test(5)
print(d.rex())

如果我运行此代码,它将返回 13 我知道解释器应用了名称修饰,因此变量__x变为_test__x但这与全局变量相同。

我尝试使用self._test__x但它不起作用

如何访问在__init __.py中声明的__x变量而不是全局变量?

根据文档,名称修改发生在 class 正文中的任何地方:

当文本出现在 class 定义中的标识符以两个或多个下划线字符开头并且不以两个或多个下划线结尾时,它被认为是该 class 的私有名称...此转换独立于其中的句法上下文使用标识符。

本教程示例显示,损坏也发生在 class 中的属性上。

但真正的问题是您的代码混淆了命名空间。 您最初显示的构造函数

def __init__(self, x):
    __x = x

创建一个局部变量_test__x ,它在完成后立即被丢弃。

要正确分配实例属性:

def __init__(self, x):
    self.__x = x

这将创建一个名称实际上是_test__x的属性。

如果你真的想分配全局:

def __init__(self, x):
    global __x
    __x = x

或者

def __init__(self, x):
    global _test__x
    __x = x

getter 需要访问实例属性,就像构造函数需要设置它一样。 当前版本正在访问全局,因为名称_tesy__x在本地命名空间中不存在:

def rex(self):
    return __x

要返回属性,请添加命名空间:

def rex(self):
    return self.__x

话虽如此,如果您有一个带有前导双下划线的模块级属性(您不应该这样做),您将很难在 class 中访问它。 您必须通过globals go ,如下所示:

globals()['__x']

我很久以前关于这个问题的无耻插件:如何从 class 访问 Python 模块的私有变量

另一个有趣的事实:如果您的 class 名称都是下划线,则根本不会发生名称修改。 您可以通过命名类__________等来逃避所有问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM