2010-04-07 17 views
16

En Python, me gustaría poder crear una función que se comporte como una función de clase y un método de instancia, pero con la capacidad de cambiar comportamientos. El caso de uso para esto es para un conjunto de objetos y tipos serializables. A modo de ejemplo:Crear un método que sea simultáneamente un método de instancia y clase

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

sé que dada la definición de classmethod() en funcobject.c en la fuente de Python, esto parece que sería sencillo con un módulo C. ¿Hay alguna manera de hacer esto desde python?

Gracias!

Con el toque de descriptores, yo era capaz de hacerlo con el siguiente código:

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 

Gracias Alex!

+1

¿Por qué necesitarías serializar el * tipo *? –

+0

hay muchas razones. En mi problema particular, serializar el tipo nos permite crear las especificaciones en un sistema RPC. –

Respuesta

8

Claro, solo necesita definir su propio descriptor tipo. Hay un excelente tutorial sobre los descriptores de Python here.

Cuestiones relacionadas