【问题标题】:Static method vs module function in pythonpython中的静态方法与模块函数
【发布时间】:2011-04-04 00:06:45
【问题描述】:
所以我在一个模块中有一个类,它有一些静态方法。其中一些静态方法只是进行 crc 检查和其他东西,它们在类之外并没有真正有用(我只会在 java 或 C++ 中将它们设为私有静态方法)。我想知道是否应该将它们设为全局类函数(在类之外)。
这样做有什么好处吗?这个类是由from module import class 导入的,所以我不担心这些模块也会被拉进来。但是我应该让它们成为类方法,以便from module import * 更安全吗?
【问题讨论】:
标签:
python
global
static-methods
【解决方案1】:
使用单个下划线作为函数名称的前缀是一种约定,表示它们是私有的,它还会阻止它们以from module import * 导入。
另一种技术是在模块中指定 __all__ 列表 - 这可以在模块本身中完成(您不需要 __init__.py 文件)
__all__ = ['my_class_name']
这更像是一种白名单方法,因此您可以完全控制导入的内容,而无需使用前导下划线。
因此,除非您的方法在逻辑上属于该类,并且根据您的描述它们不属于该类,否则我会将它们保留为模块级函数并使用这两种方法之一将它们设为私有。
【解决方案2】:
使它们成为模块级函数,并在它们前面加上一个下划线,以便消费者了解它们是供私人使用的。
【解决方案3】:
如果它们在类之外没有用,那么使它们成为模块方法的动机是什么?将它们保留为静态方法使名称空间更清晰。
将它移到外面的唯一好处可能是人们可以在不使用限定类名的情况下引用它们。假设您有一个日志方法在很多地方都得到了引用,这可能是一种风格选择。