我正在经历一种模糊的(对我来说(无序作用域效应,并试图为其制定规则:
#!/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
本应是模块全局变量的内容被视为类级属性,如果未定义,则被标记为未定义。
我一直在试图查看文档,但似乎无法确定规则是什么。
有人能给我指一下合适的文件吗?
文档引用的名称如class private名称:
__*
类私有名称。当在类定义的上下文中使用该类别中的名称时,会重写为使用损坏的形式有助于避免base和的"private"属性之间的名称冲突派生类。请参阅标识符(名称(一节。
由于子类化不适用于模块(至少,在语言提供任何工具或建议的范围内,不适用于如何进行子类化(,因此不需要使用类私有名称,而_
前缀的名称将起作用。
#!/usr/bin/env python3
stuff = "the things"
_MORE_STUFF = "even more"
class Thing:
def __init__(self):
print(stuff) # is OK
print(_MORE_STUFF)
Thing()