arn*_*ino 7 python methods static static-methods function
我正在为图像处理算法编写一个类,它有一些方法,特别是一些静态方法。我的 IDE 不断告诉我将静态方法转换为函数,这导致我提出以下问题:
什么时候应该将静态方法变成函数?什么时候不应该呢?
Man*_*ive 11
python 中没有关于此决定的固定规则,但有一些风格指南,例如由希望解决何时使用什么的模糊性的公司定义的。一个流行的例子是Google Python 风格指南:
除非被迫与现有库中定义的 API 集成,否则切勿使用 staticmethod。而是编写一个模块级函数。
我的猜测是,您的 IDE 遵循了对静态方法的强行拒绝的立场。如果您决定仍要使用静态方法,则可以尝试通过在显示警告的行上添加# noqa作为注释来禁用警告。或者您可以在 IDE 中查找全局禁用此类警告的设置。
但这只是一种意见。有些人确实看到了使用静态方法的价值(静态方法被认为是有益的,为什么Python开发人员应该使用@staticmethod和@classmethod),还有其他人反对使用静态方法(对Python中@staticmethod用法的思考,@staticmethod)被认为是代码味道)
此讨论中经常引用的另一句话来自 Guido van Rossum(Python 的创建者):
老实说,staticmethod 是一个错误——我试图做一些类似于 Java 类方法的事情,但是一旦它发布,我发现真正需要的是 classmethod。但摆脱静态方法已经太晚了。
我整理了一份我发现的参数列表,没有任何评估或顺序。
静态方法降低了它所在类的内聚性,因为它不使用类提供的任何属性。
要调用静态方法,任何其他模块都需要导入整个类,即使您只想使用该方法也是如此。
静态方法将方法绑定到类的命名空间,这使得编写代码的时间更长,SomeWhatDescriptiveClassName.method并且method如果更改类,重构代码的工作量也会增加。
在其他类或上下文中更容易重用方法。
静态方法的调用签名与类方法或实例方法的调用签名相同。这掩盖了这样一个事实:静态方法实际上并不读取或修改任何对象信息,尤其是从实例调用时。模块级函数使这一点变得明确。
由于受您的类必须使用的 API 的约束,它可能是唯一有效的选项。
该方法可能使用多态性。可以覆盖子类中的静态方法来改变行为。
将方法直接分组到要与其一起使用的类。
与模块级函数相比,类方法、实例方法和静态方法之间的重构更容易。
将方法放在类的命名空间下可以帮助减少模块内可能的命名空间冲突,并减少整个模块的命名空间。
在我看来,没有强有力的论据支持或反对静态方法(除了受 API 约束)。因此,如果您所在的组织提供了可遵循的代码标准,那就这样做吧。否则,这取决于什么可以帮助您最好地构建代码以实现可维护性和可读性,并传达代码的用途和使用方式的信息。
| 归档时间: |
|
| 查看次数: |
1287 次 |
| 最近记录: |