【发布时间】:2020-12-18 02:28:10
【问题描述】:
问题 [python 3.8.6]
def __foo():
pass
class MyClass:
@staticmethod
def bar():
__foo()
MyClass.bar()
结果:
NameError: name '_MyClass__foo' is not defined
观察
-
如果我用
foo()替换__foo(),它运行良好。 -
我意识到 python 正在
MyClass中寻找__foo()。在 C++ 中,我可以使用::__foo()在模块级别显式调用函数。 python中是否有等价物?
问题
-
你能解释我为什么会收到这个错误吗?
-
我如何保留
__foo()并从类内部调用它?
分辨率
我对 python 中的命名约定有一个误解。
类中的私有方法和符号有双下划线前缀,但模块级别的相同符号有单下划线前缀。 p>
【问题讨论】:
-
@juanpa.arrivillaga 将函数的范围限制在模块中。如果我将它添加为后缀,它也可以工作。我需要在 python 中找到正确命名的规则。
-
这并没有将函数的范围限制在模块中......为什么你认为它会这样做? 传统上 API 的非公开部分使用单 下划线。
-
Thx - 单下划线也可以。您能否指出一些描述所有下划线约定的文档?谢谢。
-
你不能。在使用星号导入时,您可以防止某些名称被引入,但是,您通常应该避免使用星号导入。按照惯例,您应该只使用一个下划线(它将自动从带星号的导入中排除,并且大多数基于 python 的工具,例如制表符完成,理解这一点并且不会显示它)
-
我也在尝试使用下划线来记录文档。阅读代码,了解哪些符号只能在模块内使用以及哪些符号应由模块外的应用程序使用是很有用的。