我有一个充满静态方法的Python类。将这些包装在一个类而不是原始函数中有哪些优点和缺点?
答案 0 :(得分:31)
没有。这就是模块的用途:对相关功能进行分组。使用一个充满静态方法的类让我对Javaitis感到畏缩。我唯一一次使用静态函数是函数是类的一个组成部分。 (事实上,我可能想要使用类方法。)
答案 1 :(得分:13)
没有。最好使它们成为函数,如果它们相关,则将它们放入自己的模块中。例如,如果您有这样的类:
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)
不要害怕命名空间。 ;-)
答案 2 :(得分:5)
如果您的功能依赖于彼此或全局状态,请考虑第三种方法:
class Something(object):
def foo(self, x):
return x + 5
def bar(self, x, y):
return y + 5 * self.foo(x)
something = Something()
使用此解决方案,您可以单独测试函数,因为您可以使用构造函数覆盖另一个函数的行为或注入依赖项。
答案 3 :(得分:1)
只有当您拥有一组功能而不是与一组数据(实例属性)交互时,类才有用,这些数据需要在函数调用之间保持并以离散方式引用。
如果你的类只包含静态方法,那么你的类只是语法上的残缺,而且直接的函数更清晰,只需要你所需要的。
答案 4 :(得分:0)
我同意本杰明的观点。你应该拥有一堆函数,而不是拥有一堆静态方法。如果你想组织它们,你应该考虑使用模块而不是类。但是,如果你想将你的代码重构为OO,那就另当别论了。
答案 5 :(得分:0)
不仅没有优势,而且比使用充满方法的模块更慢。 python中的静态方法比java或c#中的静态方法要少得多,它们在非常特殊的情况下使用。
答案 6 :(得分:0)
取决于功能的性质。如果它们不是非常不相关(它们之间的呼叫次数最少)并且它们没有任何状态,那么我会说将它们转储到模块中。但是,如果您需要修改行为,那么您可能会在脚下射击自己,因为您将继承抛出窗外。所以我的答案是也许,并且确保你看看你的特定场景,而不是总是假设模块是收集一组方法的最佳方式。