2010-04-07 5 views
16

En Python, j'aimerais pouvoir créer une fonction qui se comporte à la fois comme une fonction de classe et une méthode d'instance, mais avec la possibilité de changer de comportement. Le cas d'utilisation de ceci est pour un ensemble d'objets et de types sérialisables. A titre d'exemple:Création d'une méthode qui est simultanément une instance et une méthode de classe

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

Je sais que compte tenu de la définition de classmethod() dans funcobject.c dans la source Python, cela ressemble à ce serait simple avec un module C. Y a-t-il un moyen de le faire depuis python?

Merci!

Avec le soupçon de descripteurs, j'ai pu le faire avec le code suivant:

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 

Merci Alex!

+1

Pourquoi auriez-vous besoin de sérialiser le * type *? –

+0

il y a beaucoup de raisons. Dans mon problème particulier, la sérialisation du type nous permet de créer les spécifications dans un système RPC. –

Répondre

8

Bien sûr, il vous suffit de définir votre propre type descripteur. Il y a un excellent tutoriel sur les descripteurs Python here.

Questions connexes