我正在经历一种模糊的作用域效应(对我来说),并试图找出解决它的规则:

#!/usr/bin/env python3

stuff = "the things"
__MORE_STUFF = "even more"

class Thing:
    def __init__(self):
        global __MORE_STUFF # doesn't help
        print(stuff) # is OK
        print(__MORE_STUFF) # fail!

Thing()

在.中的结果

$ python3 dunder.py
the things
Traceback (most recent call last):
  File "dunder.py", line 12, in <module>
    Thing()
  File "dunder.py", line 10, in __init__
    print(__MORE_STUFF) # fail!
NameError: name '_Thing__MORE_STUFF' is not defined

被认为是模块全局变量的变量被视为类级属性,如果未定义,则被标记为未定义.

我一直在试图查阅文档,但我似乎无法弄清楚这条规则是什么.

有谁能给我指给我合适的文件吗?

推荐答案

documentation个名字指的是class-private个名字:

__*

班级专用名称.此类别中的名称在类定义的上下文中使用时,将被重写为使用损坏的形式 帮助避免base和"私有"属性之间的名称冲突 派生类.请参见第Identifiers (Names)节.

由于子类化不适用于模块(至少,这种语言提供的工具或建议不适用于模块),所以没有必要使用类私有名称,而_前缀的名称就可以了.

#!/usr/bin/env python3

stuff = "the things"
_MORE_STUFF = "even more"

class Thing:
    def __init__(self):
        print(stuff) # is OK
        print(_MORE_STUFF)

Thing()

Python相关问答推荐

非常奇怪:tzLocal.get_Localzone()基于python3别名的不同输出?

运行终端命令时出现问题:pip start anonymous"

在极性中创建条件累积和

部分视图的DataFrame

删除marplotlib条形图上的底边

将pandas导出到CSV数据,但在此之前,将日期按最小到最大排序

通过ManyToMany字段与Through在Django Admin中过滤

如何使regex代码只适用于空的目标单元格

关于两个表达式的区别

使用类型提示进行类型转换

使用Python TCP套接字发送整数并使用C#接收—接收正确数据时出错

按条件添加小计列

如何用FFT确定频变幅值

Pandas数据框上的滚动平均值,其中平均值的中心基于另一数据框的时间

pytest、xdist和共享生成的文件依赖项

如何在Polars中创建条件增量列?

如何删除剪裁圆的对角线的外部部分

关于数字S种子序列内部工作原理的困惑

使用_in链接操作管道传输的中间结果是否可用于链中的后续函数?

使用Python下载pdf url