创建同时是实例和类方法的方法

Mik*_*iak 17 python methods

在Python中,我希望能够创建一个既可以作为类函数又可以作为实例方法的函数,但能够更改行为.用例是针对一组可序列化的对象和类型.举个例子:

>>> class Thing(object):
    #...
>>> Thing.to_json()
'A'
>>> Thing().to_json()
'B'
Run Code Online (Sandbox Code Playgroud)

我知道,鉴于Python源代码中funcob.c中classmethod()的定义,看起来它对于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
Run Code Online (Sandbox Code Playgroud)

谢谢亚历克斯!

Ale*_*lli 8

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

  • 如果这个答案提供了一个问题的大纲解决方案,而不仅仅是一个研究指针,那么它会更有用。只有那时它才会赢得我的支持。 (6认同)
  • 对于 9 年后的更新,[Python 文档](https://docs.python.org/3/howto/descriptor.html) 现在托管来自 Raymond Hettinger 的本教程,它不再位于发布的链接中。(您可以在 archive.org 上查看原始版本的缓存版本,但它只是 Python 文档中版本的一个稍小的版本)。 (2认同)