2009-01-18 162 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

取決於功能的性質。如果它們不是非常不相關(它們之間的通話量最小)並且它們沒有任何狀態,那麼是的,我會說把它們轉儲到一個模塊中。但是,如果您需要修改行爲,那麼您可能會將自己踢在腳下,因爲您正在將遺產扔出窗外。所以我的回答是也許,並確保你看看你的特定場景,而不是總是假設一個模塊是收集一套方法的最好方法。