2013-02-15 57 views

回答

2

雖然a module (as suggested by mgilson)是一個更好的選擇,如果你真的這個(我想不出一個的)很好用的,它與the inspect module,也比較容易一類裝飾:

import inspect 

def staticmethods(cls): 
    for name, method in inspect.getmembers(cls, inspect.ismethod): 
     setattr(cls, name, staticmethod(method.__func__)) 
    return cls 

@staticmethods 
class Test: 
    def test(): 
     print("Test") 

Test.test() 

所有類裝飾的作用是循環通過在物體上的方法與inspect.getmembers(),然後重寫與原始(未結合的)函數的staticmethod()功能。

請注意,我會爲此使用一個模塊而不是類,也可能只是在每個函數上以這種方式手動調用@staticmethod(因爲這例如會中斷編輯器的檢查)。這個答案被證明是可能的,因爲這是一個非常簡單的實現。

+0

謝謝,這是我想要的 – Neil 2013-02-16 16:35:28

4

如果沒有一種方法共享任何狀態,根本沒有什麼理由擁有一個類。與功能模塊可能是一個更好的主意......

+0

+1,我只是想說這個。只有靜態方法的類相當於一個模塊,並且更容易實現。 – 2013-02-15 16:21:36

+0

@Lattyware - 是的。你不能繼承它,但這並沒有真正的區別... – mgilson 2013-02-15 16:21:59

+0

是的,這些函數的模塊是一個更好的主意,但我將邏輯上相關的函數分組到一個類 – Neil 2013-02-16 16:38:04

1

mgilson's answer是最好的,但要加這是經常用於定義一個類,命名空間另一種模式,你也可以實例化類,覆蓋類名稱:

class Test: 
    def a_static_method(self, arg1, srg2): 
     pass 

Test = Test() 

要知道,雖然,此後Test實際上是一個類實例,根據您的使用方式可能會產生誤導。

+1

這是狡猾的... – mgilson 2013-02-15 16:53:25

相關問題