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

25 投票
1 回答
2217 浏览
提问于 2025-04-15 21:19

在Python中,我想创建一个既可以作为类方法又可以作为实例方法的函数,而且还可以改变它的行为。这样做的目的是为了处理一组可以序列化的对象和类型。举个例子:

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

我知道在Python源代码的funcobject.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

谢谢你,Alex!

1 个回答

9

当然,你只需要定义你自己的描述符类型。关于Python描述符的一个很棒的教程可以在这里找到。

撰写回答