2010-04-07 228 views
16

在Python中,我希望能夠創建一個既可以作爲類函數又可以作爲實例方法運行的函數,但可以更改行爲。這個用例用於一組可序列化的對象和類型。舉個例子:創建一個同時是實例和類方法的方法

>>> class Thing(object): 
    #... 
>>> Thing.to_json() 
'A' 
>>> Thing().to_json() 
'B' 

我知道,鑑於在Python源的類方法的定義()在funcobject.c,這看起來像它會是與C模塊簡單。有沒有辦法從Python內做到這一點?

謝謝!

隨着描述符的提示,我能夠用下面的代碼來做到這一點:

class combomethod(object): 
    def __init__(self, method): 
     self.method = method 

    def __get__(self, obj=None, objtype=None): 
     @functools.wraps(self.method) 
     def _wrapper(*args, **kwargs): 
      if obj is not None: 
       return self.method(obj, *args, **kwargs) 
      else: 
       return self.method(objtype, *args, **kwargs) 
     return _wrapper 

謝謝亞歷克斯!

+1

爲什麼你需要序列化*類型*? – 2010-04-07 02:48:21

+0

有很多原因。在我的特定問題中,序列化類型允許我們在RPC系統中創建規範。 – 2010-04-07 03:02:02

回答

8

當然,你只需要定義你自己的描述符類型。關於Python描述符here有一個很好的教程。

相關問題