20

我有一个充满静态方法的 Python 类。将这些封装在一个类而不是原始函数中的优点和缺点是什么?

4

7 回答 7

35

没有了。这就是模块的用途:对相关功能进行分组。使用一个充满静态方法的类让我对 Javaitis 感到畏缩。我唯一会使用静态函数的情况是该函数是类的一个组成部分。(事实上​​,我可能还是想使用类方法。)

于 2009-01-18T22:12:04.487 回答
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)

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

于 2009-01-18T22:17:46.610 回答
5

如果您的函数相互依赖或依赖全局状态,请考虑第三种方法:

class Something(object):
    def foo(self, x):
        return x + 5

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

something = Something()

使用此解决方案,您可以单独测试一个函数,因为您可以覆盖另一个函数的行为或使用构造函数注入依赖项。

于 2009-01-19T00:16:32.817 回答
2

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

如果您的类只包含静态方法,那么您的类只是语法上的杂乱无章,而直接函数则更清晰,并且满足您的所有需求。

于 2009-01-18T23:02:28.160 回答
1

不仅没有优势,而且比使用充满方法的模块更慢。python中对静态方法的需求比java或c#中对静态方法的需求要少得多,它们在非常特殊的情况下使用。

于 2009-01-18T22:16:26.787 回答
0

我同意本杰明的观点。与其拥有一堆静态方法,不如拥有一堆函数。如果你想组织它们,你应该考虑使用模块而不是类。但是,如果您想将代码重构为 OO,那就另当别论了。

于 2009-01-18T22:15:47.287 回答
0

取决于函数的性质。如果它们不是非常不相关(它们之间的调用量最少)并且它们没有任何状态,那么是的,我会说将它们转储到一个模块中。但是,如果您在将继承扔出窗外时需要修改行为,您可能会自责。所以我的答案是也许,并且确保你查看你的特定场景,而不是总是假设一个模块是收集一组方法的最佳方式。

于 2009-01-19T00:31:36.793 回答