如何在类内部调用私有模块函数?

1 投票
1 回答
3676 浏览
提问于 2025-04-16 03:56

我有一个模块,看起来像这样:

def __myFunc():
    ...

class MyClass(object):
    def __init__(self):
        self.myVar = __myFunc()

然后我遇到了这个错误:

NameError: global name '_MyClass__myFunc' is not defined

我该如何在类里面调用这个函数呢?

补充说明:在我发这个问题后,我发现可以通过使用一个下划线而不是两个下划线来避免自动修改。我之前使用了两个下划线,是因为《Dive Into Python》这本书说双下划线表示私有函数。

1 个回答

6

这是因为Python的编译器会对类里面以两个下划线开头的方法调用(和属性访问)进行替换。看起来这也适用于函数。比如,调用一个方法self.__X时,实际上会被替换成self._ClassName__X。这样做的好处是可以实现伪私有的属性和方法。

在模块里面,使用两个下划线的函数是没有任何必要的。程序员通常会遵循一个约定,就是在函数名前加一个下划线,如果这个函数不应该被外部调用。

只有在类里面的属性或方法不希望被子类覆盖时,才需要使用两个下划线。例如,这种情况很少见。

撰写回答