2010-04-07 15 views
16

Python'da, hem sınıf işlevi hem de örnek yöntemi olarak davranan, ancak davranışları değiştirme becerisine sahip bir işlev oluşturmak istiyorum. Bunun kullanım durumu, bir dizi serileştirilebilir nesne ve tip içindir. Örnek olarak:Eşzamanlı olarak bir örnek ve sınıf yöntemi olan bir yöntem oluşturma

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

Ben bir C modülü ile basit olacak gibi Python kaynağındaki funcobject.c içinde classmethod tanımı() göz önüne alındığında, bu görünüyor biliyoruz. Bunu python içinden yapmanın bir yolu var mı?

Teşekkürler! tanımlayıcıların ipucu ile

, Aşağıdaki kod ile bunu başardı:
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 

Alex ederiz!

+1

Neden * type * serileştirmesi gerekiyor? –

+0

birçok nedeni vardır. Benim sorunumda, türün serileştirilmesi bir RPC sistemindeki özellikleri oluşturmamızı sağlar. –

cevap

8

Elbette, sadece kendi tanımlayıcınızı tür tanımlamanız gerekiyor. Python tanımlayıcıları here üzerinde mükemmel bir öğretici var.

İlgili konular