使用Python类有什么优势吗?

21

我有一个 Python 类,里面充满了静态方法。相比于原始函数,将它们封装在类中的优缺点是什么?


我同意这里的共识,所以我想知道:为什么Python支持静态方法呢? - Darius Bacon
@Darius 主要是为了面向对象的一致性。 - Benjamin Peterson
7个回答

35

没有。这就是模块的用途:将相关函数分组。使用一个充满静态方法的类会让我感到非常不舒服。我只会在函数是类的一个整体部分时使用静态函数。(事实上,我可能仍然想要使用类方法。)


17
不。最好将它们制作为函数,如果它们相关,则将它们放置在自己的模块中。例如,如果您有这样一个类:
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)

不要害怕命名空间。;-)


5
如果您的函数彼此依赖或依赖于全局状态,请考虑第三种方法:
class Something(object):
    def foo(self, x):
        return x + 5

    def bar(self, x, y):
        return y + 5 * self.foo(x)

something = Something()

使用这个解决方案,你可以在隔离的情况下测试一个函数,因为你可以覆盖另一个函数的行为或者使用构造函数注入依赖。

2

只有当您拥有一组与数据交互(实例属性)并需要在函数调用之间持久化并以离散方式引用的功能集时,类才有用。

如果您的类除了静态方法之外什么也没有,那么您的类只是语法上的累赘,直接使用函数会更加清晰,而且就足够了。


1

不仅没有优势,而且使用静态方法会比使用一个充满方法的模块更慢。在Python中,相对于Java或C#,静态方法的需求要少得多,它们只在非常特殊的情况下使用。


0

我同意Benjamin的观点。与其拥有一堆静态方法,你可能应该拥有一堆函数。如果你想要组织它们,你应该考虑使用模块而不是类。然而,如果你想重构你的代码成为面向对象的,那就是另外一回事了。


0

这取决于函数的性质。如果它们之间没有强烈的关联(最少的调用量)并且它们没有任何状态,那么我会建议将它们放入一个模块中。然而,如果您需要修改行为,那么您可能会自食其果,因为您正在抛弃继承。所以我的答案是也许,一定要根据您的特定情况来考虑,而不是总是假设模块是收集一组方法的最佳方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接