python无法从staticmethod调用模块方法?

python无法从staticmethod调用模块方法?,python,Python,考虑以下模式: '''some module body''' def __foo(): '''module method foo''' pass class Dummy(object): @staticmethod def bar(): __foo() __foo() # No Error. Dummy.bar() #NameError: Global name "_Dummy__foo" is not defined. 为什么会这样 --

考虑以下模式:

'''some module body'''

def __foo():
    '''module method foo'''
    pass

class Dummy(object):
    @staticmethod
    def bar():
        __foo()

__foo() # No Error.
Dummy.bar() #NameError: Global name "_Dummy__foo" is not defined.
为什么会这样

--


如果用“_u”来命名是不好的,那么Python中使模块方法仅对内部模块函数/方法可用的最佳实践是什么?

不要以双下划线开始名称。在类语句中找到的任何标识符,至少以2个下划线开始,以少于2个下划线结束,都会在其前面加上
\u Classname
,其中
Classname
是类的名称。这应该为私有ish变量提供有限的支持,但使用它通常被认为是不好的做法。

欢迎使用name mangling.cf的概念。这个“任何形式的标识符
\uuuu spam
(至少两个前导下划线,最多一个尾随下划线)现在以文本形式替换为
\u classname\uuuu spam
,其中
classname
是当前的类名,去掉前导下划线。”更好地参考文档(不适用于过时的版本):“Python中使模块方法仅对内部模块函数/方法可用的最佳实践“就是根本不要这样做。在Python中几乎不可能使任何东西真正私有化。这是故意的。取而代之的是,在模块客户端不应触摸的任何东西前面加上一个下划线,并且不要触摸其他模块中以下划线开头的任何东西。从技术上讲,这是为了防止MI冲突(无论如何,MI不是一个好主意…)。