【发布时间】:2010-10-02 03:26:53
【问题描述】:
我有一个充满静态方法的 Python 类。将这些封装在一个类中而不是原始函数中的优点和缺点是什么?
【问题讨论】:
-
我同意这里的共识,所以我想知道:为什么Python完全支持静态方法?
-
@Darius 主要是为了 OO 一致性
标签: python class static-methods
我有一个充满静态方法的 Python 类。将这些封装在一个类中而不是原始函数中的优点和缺点是什么?
【问题讨论】:
标签: python class static-methods
没有。这就是模块的用途:对相关功能进行分组。使用一个充满静态方法的类让我对 Javaitis 感到畏缩。我唯一会使用静态函数的情况是该函数是类的一个组成部分。 (事实上,我可能还是想使用类方法。)
【讨论】:
我同意本杰明的观点。与其拥有一堆静态方法,不如拥有一堆函数。如果你想组织它们,你应该考虑使用模块而不是类。但是,如果你想将你的代码重构为 OO,那就另当别论了。
【讨论】:
不仅没有优势,而且比使用充满方法的模块更慢。 python 中对静态方法的需求远少于 java 或 c# 中的静态方法,它们用于非常特殊的情况。
【讨论】:
没有。最好使它们起作用,如果它们相关,则将它们放入自己的模块中。例如,如果您有这样的课程:
class Something(object):
@staticmethod
def foo(x):
return x + 5
@staticmethod
def bar(x, y):
return y + 5 * x
那么最好有一个类似的模块,
# something.py
def foo(x):
return x + 5
def bar(x, y):
return y + 5 * x
这样,您可以通过以下方式使用它们:
import something
print something.foo(10)
print something.bar(12, 14)
不要害怕命名空间。 ;-)
【讨论】:
类仅在您拥有一组功能而不是与一组需要在函数调用之间持久化并以离散方式引用的数据(实例属性)交互时才有用。
如果你的类只包含静态方法,那么你的类只是语法上的杂乱无章,而直接的函数更清晰,满足你的所有需求。
【讨论】:
如果您的函数相互依赖或依赖全局状态,请考虑第三种方法:
class Something(object):
def foo(self, x):
return x + 5
def bar(self, x, y):
return y + 5 * self.foo(x)
something = Something()
使用此解决方案,您可以单独测试一个函数,因为您可以覆盖另一个函数的行为或使用构造函数注入依赖项。
【讨论】:
取决于函数的性质。如果它们不是非常不相关(它们之间的调用量最少)并且它们没有任何状态,那么是的,我会说将它们转储到一个模块中。但是,如果您在将继承扔出窗外时需要修改行为,那么您可能会自责。所以我的回答是也许,并确保您查看您的特定场景,而不是总是假设模块是收集一组方法的最佳方式。
【讨论】: