2009-01-18 116 views
16

我有一个充满静态方法的Python类。将这些包装在一个类中而非原始函数中的优缺点是什么?使用Python类有什么好处吗?

+0

我同意这里的共识,所以我想知道:为什么Python支持静态方法呢? – 2009-01-18 22:20:51

回答

29

没有。这是模块的用途:分组相关的功能。使用完整的静态方法让我对Javaitis感到畏惧。我唯一会使用静态函数的地方是函数是类的一个组成部分。 (实际上,我可能想要使用类方法。)

0

我同意本杰明。而不是有一堆静态方法,你应该有一堆功能。如果你想组织它们,你应该考虑使用模块而不是类。然而,如果你想重构你的代码是OO,那是另一回事。

0

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

12

不需要。让它们起作用会更好,如果它们相关,则将它们放入它们自己的模块中。举例来说,如果你有一个这样的类:

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) 

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

1

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

如果你的类不包含静态方法以外的东西,那么你的类只是句法cruft,直接函数更清晰,你需要的东西。

5

如果你的职能是彼此依赖或全局状态,也可以考虑第三种方法:

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

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

something = Something() 

使用此解决方案,您可以测试在隔离功能,因为你可以覆盖其他功能的行为或注入使用构造函数的依赖关系。

0

取决于功能的性质。如果它们不是非常不相关(它们之间的通话量最小)并且它们没有任何状态,那么是的,我会说把它们转储到一个模块中。但是,如果您需要修改行为,那么您可能会将自己踢在脚下,因为您正在将遗产扔出窗外。所以我的回答是也许,并确保你看看你的特定场景,而不是总是假设一个模块是收集一套方法的最好方法。