Создание метода, который является одновременно методом экземпляра и класса - PullRequest
17 голосов
/ 07 апреля 2010

В 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

Спасибо, Алекс!

1 Ответ

8 голосов
/ 07 апреля 2010

Конечно, вам просто нужно определить свой собственный тип дескриптор . Здесь есть превосходное руководство по дескрипторам Python здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...