2012-07-28 72 views
1

有沒有辦法找到staticmethod所屬類的名稱?staticmethod:獲取類名?

class A(object): 
    @staticmethod 
    def my_staticmethod(): 
     return 'static' 

    @classmethod 
    def my_classmethod(): 
     return 'classmethod' 


In [2]: A.my_staticmethod 
Out[2]: <function utils.my_staticmethod> 

In [3]: A.my_classmethod 
Out[3]: <bound method type.my_classmethod of <class 'utils.A'>> 
In [4]: A.my_classmethod.im_self.__name__ 
Out[4]: 'A' 

對於類方法,我可以通過A.my_classmethod.im_self.__name__獲取類的名字,但我無法弄清楚一個靜態方法。

有什麼想法? 謝謝。


嗯,實際上這是我正在嘗試做的。 我想做2個函數來「序列化/反序列化」一個函數/ classmethod/staticmethod。

這意味着,有人可以將函數傳遞到序列化函數並獲取字符串。

a_string = serialize(A.my_classmethod) 

此字符串可以存儲在數據庫例如.. 然後,該字符串應該足以解決函數可以調用它:

# later on... 
f = deserialize(a_string) 
# I can use my function 
f(...) 

我可以使它工作對於一個函數或類方法,但不是靜態方法,因爲我無法弄清它所屬的類,並使用getattr ...

+0

可能重複[在python中如何獲取其靜態方法中的類的名稱](http://stackoverflow.com/questions/4691925/in-python-how-to-get-name-of-a- class-inside-its-static-method) – BrenBarn 2012-07-28 20:51:52

+0

基本上靜態方法的要點是它與其類沒有關係。如果你想知道它在什麼類,不要使用靜態方法。 – BrenBarn 2012-07-28 20:52:40

+0

這裏也重複:http://stackoverflow.com/questions/949259/how-do-i-infer-the-class-to-which-a-staticmethod-belongs – gnr 2012-07-28 20:55:42

回答

0

使用「巫術」,你可以解決它,但認真 - 你只是想繞過數據模型 - 那有什麼好處?如果你想要一個類方法 - 使用一個類方法。如果它們的意圖是可以互換的,它們就不會有所不同了!

而且也:

@classmethod 
def my_classmethod(): 
    return 'classmethod' 

真的應該是:

@classmethod 
def my_classmethod(cls): # assuming no args 
    return cls.__name__ # instead of A.my_classmethod.im_self.__name__ 
+0

實際上,我不知道classmethod會做什麼,我沒有找到返回類的名字的方法。看看我的第二篇文章,看看我的意思。謝謝。 – Michael 2012-07-28 21:19:13

+0

針對你的兩個問題:1)爲什麼這不是你原來的問題=>我想問一個更簡單的問題,只是詢問我正在經歷的路障,就是讓類名知道靜態方法。 2)每個人都告訴你這是一個壞主意,雖然可以用黑魔法,但你認爲這仍然是正確的做事方式嗎? =>我使用的是Django信號,我想在數據庫中堅持連接到信號的接收器(不知道它們),因此我希望能夠序列化/反序列化函數(即使它是靜態方法)。希望現在有意義。 – Michael 2012-07-29 07:40:52

0

在回答您有關序列化/反序列化評論,你可以改變接口:

def serialize(cls, function): 
    return '{cls}.{func}'.format(cls=cls.__name__, func=function.__name__) 

和你可以爲任何模塊級功能使用sys.modules[__name__].__name__

對於反序列化,您可能會發現inspect.classify_class_attrs(cls)有用。

+0

好的,所以我得出結論,沒有辦法從靜態方法訪問類的名稱,而不通過類本身。無論函數是什麼,我都希望擁有相同的用例(僅傳遞一個函數)。那麼,我會避免傳遞一個靜態方法,然後在文檔中寫入staticmethods不起作用。謝謝。 – Michael 2012-07-29 07:45:26