关于python:创建同时是实例和类方法的方法

Creating a method that is simultaneously an instance and class method

在Python中,我希望能够创建一个同时作为类函数和实例方法运行的函数,但是能够更改行为。它的用例用于一组可序列化的对象和类型。举个例子:

1
2
3
4
5
6
>>> class Thing(object):
    #...
>>> Thing.to_json()
'A'
>>> Thing().to_json()
'B'

我知道,在python源代码的funcobject.c中,给定classmethod()的定义,这看起来对于C模块很简单。有没有一种方法可以从Python中实现这一点?

谢谢!

有了描述符的提示,我可以用以下代码来完成它:

1
2
3
4
5
6
7
8
9
10
11
12
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

谢谢你,亚历克斯!


当然,您只需要定义自己的描述符类型。这里有一个关于Python描述符的优秀教程。