我有一个 Python 类,里面充满了静态方法。相比于原始函数,将它们封装在类中的优缺点是什么?
我有一个 Python 类,里面充满了静态方法。相比于原始函数,将它们封装在类中的优缺点是什么?
没有。这就是模块的用途:将相关函数分组。使用一个充满静态方法的类会让我感到非常不舒服。我只会在函数是类的一个整体部分时使用静态函数。(事实上,我可能仍然想要使用类方法。)
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()
只有当您拥有一组与数据交互(实例属性)并需要在函数调用之间持久化并以离散方式引用的功能集时,类才有用。
如果您的类除了静态方法之外什么也没有,那么您的类只是语法上的累赘,直接使用函数会更加清晰,而且就足够了。
不仅没有优势,而且使用静态方法会比使用一个充满方法的模块更慢。在Python中,相对于Java或C#,静态方法的需求要少得多,它们只在非常特殊的情况下使用。
我同意Benjamin的观点。与其拥有一堆静态方法,你可能应该拥有一堆函数。如果你想要组织它们,你应该考虑使用模块而不是类。然而,如果你想重构你的代码成为面向对象的,那就是另外一回事了。
这取决于函数的性质。如果它们之间没有强烈的关联(最少的调用量)并且它们没有任何状态,那么我会建议将它们放入一个模块中。然而,如果您需要修改行为,那么您可能会自食其果,因为您正在抛弃继承。所以我的答案是也许,一定要根据您的特定情况来考虑,而不是总是假设模块是收集一组方法的最佳方式。