我有一个看起来像这样的模块:
def __myFunc():
...
class MyClass(object):
def __init__(self):
self.myVar = __myFunc()
我收到错误:
NameError: global name '_MyClass__myFunc' is not defined
如何在课堂内调用此功能?
编辑:自发布以来,我发现我可以通过使用单个下划线而不是双下划线来避免自动修改。我按照“Dive Into Python”使用了两个,它只表示双下划线表示私有函数。
答案 0 :(得分:5)
这是因为如果名称以两个下划线开头,Python的编译器会替换类中的方法调用(和属性访问)。这似乎也适用于功能。例如,对self.__X
方法的调用将替换为self._ClassName__X
。这使得伪私有属性和方法成为可能。
绝对没有理由在模块内部使用两个下划线。如果不应该从外部调用函数,程序员通常会遵循将一个下划线放在函数名前面的惯例。
例如,如果您不希望子类覆盖属性/方法,则只需要使用两个下划线。但是很少有这种情况有用。