静态方法何时应成为函数?

When should a static method be a function?

提问人:arnino 提问时间:7/5/2022 更新时间:7/26/2022 访问量:1058

问:

我正在为图像处理算法编写一个类,该算法具有一些方法,尤其是一些静态方法。我的IDE一直告诉我将静态方法转换为函数,这让我想到了以下问题:

什么时候应该将静态方法转换为函数?什么时候不应该?

Python 函数 静态 方法

评论

0赞 pho 7/19/2022
如果函数与类捆绑在一起是有意义的,因为它创建或操作类的实例,则使其成为静态方法。如果它与您的类完全无关,请将其设为常规函数。

答:

11赞 MangoNrFive 7/19/2022 #1

python 中没有关于这个决定的固定规则,但有一些风格指南,例如由公司定义的,这些公司希望解决何时使用什么的模糊性。一个流行的例子是 Google Python 风格指南

切勿使用 static方法,除非为了与现有库中定义的 API 集成而被迫使用。改为编写模块级函数。

我的猜测是,您的 IDE 遵循了这种反对静态方法的立场。如果您决定仍然要使用 staticmethods,您可以尝试通过在显示警告的行上添加 # noqa 作为注释来禁用警告。或者,您可以在 IDE 中查找全局禁用此类警告的设置。

但这只是一种意见。有一些人确实看到了使用静态方法的价值(staticmethod 被认为是有益的为什么 Python 开发人员应该使用 @staticmethod 和 @classmethod),还有一些人反对使用 staticmethods(关于 Python 中@staticmethod用法的思考@staticmethod被认为是一种代码气味)

在这个讨论中经常被引用的另一句话来自Guido van Rossum(Python的创造者):

老实说,静态方法有点错误——我试图这样做 做一些类似 Java 类方法的事情,但一旦它发布,我发现 真正需要的是 classmethod。但为时已晚 的静态方法。


我编制了一份我找到的论点清单,没有任何评估或顺序。

专业模块级功能:

  • Staticmethod 降低了它所处类的内聚性,因为它不使用类提供的任何属性。

  • 要调用 staticmethod,任何其他模块都需要导入整个类,即使您只想使用该方法。

  • Staticmethod 将该方法绑定到类的命名空间,这使得编写时间更长,而不是在更改类时重构代码的工作量更大。SomeWhatDescriptiveClassName.methodmethod

  • 更容易在其他类或上下文中重用方法。

  • staticmethod 的调用签名与 classmethod 或 instancemethod 的调用签名相同。这掩盖了这样一个事实,即 staticmethod 实际上不会读取或修改任何对象信息,尤其是在从实例调用时。模块级函数明确了这一点。

静态方法:

  • 受类必须使用的 API 的约束,它可能是唯一有效的选项。

  • 该方法可能使用多态性。可以覆盖子类中的 staticmethod 以更改行为。

  • 将方法直接分组到要与之一起使用的类。

  • 与模块级函数相比,更容易在 classmethod、instancemethod 和 staticmethod 之间重构。

  • 将方法放在类的命名空间下有助于减少模块内可能的命名空间冲突,并从整体上减少模块的命名空间。

在我看来,没有强有力的论据支持或反对静态方法(除了被 API 绑定)。因此,如果你在一个提供代码标准的组织中工作,那就去做吧。否则,它归结为什么最能帮助您构建代码以实现可维护性和可读性,并传达您的代码旨在做什么以及如何使用它的信息。