В Python я хотел бы иметь возможность создавать функцию, которая ведет себя как функция класса и как метод экземпляра, но с возможностью изменения поведения. Вариант использования для этого предназначен для набора сериализуемых объектов и типов. Как пример:
>>> class Thing(object):
#...
>>> Thing.to_json()
'A'
>>> Thing().to_json()
'B'
Я знаю, что, учитывая определение classmethod () в funcobject.c в исходном коде Python, это выглядит так, как будто это будет просто с модулем 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
Спасибо, Алекс!