我知道变量名中的前导下划线对解释器没有任何意义(使用*导入时除外),因此,在尝试理解其他人的代码时遇到的以下问题使我感到困惑: / p>
我有一个名为 Configuration 的类和一个名为 Interface 的类。
配置具有一个名为 _chooser 的属性(带有一个下划线),该属性通常包含另一个对象。
class Configuration(object):
def __init__(self):
self._chooser = AnotherObj()
通过其他功能, Configuration 的实例(我们将其称为 ConfigObj )被赋予 Interface 的新实例(我们将其称为它 InterfaceObj )。 ConfigObj 也存储为新的 InterfaceObj 对象的属性。
class Interface(object)
def __init__(self, config):
self.config = config
def aFunction(self)
print(self.config.chooser)
def someOtherFunction()
ConfigObj = Configuration()
InterfaceObj = Interface(ConfigObj)
现在, InterfaceObj 的函数可以访问变量 self.config.chooser (没有下划线!),即使我从未定义过,也很难它。 变量 chooser 也不会显示在自动填充中( _chooser 会显示),也不会使用
显示dir(self.config)
或
vars(self.config)
(都在 aFunction 中的 self.config.chooser 有问题的调用之前被调用)
请记住,以上代码段是整个实际代码的简化版本。我仔细检查了所有内容,但不知道是什么原因,没有下划线的变量是从哪里来的,或者为什么它不可见。 我也无法在单独的环境中复制它,并且我定义的任何其他变量都必须用下划线调用,否则它们只会返回 None 。
这里可能发生什么魔术? 非常感谢您的帮助!