2010-04-07 107 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有一个很好的教程。

相关问题