Ответа Алекса достаточно, когда функции достаточно. Однако, когда вам нужен класс, вы можете заставить его работать, добавив следующий метод в класс декоратора.
def __get__(self, obj, objtype):
"""Support instance methods."""
import functools
return functools.partial(self.__call__, obj)
Чтобы понять это, вам нужно понять протокол дескриптора. Протокол дескриптора - это механизм для привязки объекта к экземпляру. Он состоит из __ get __, __set __ и __ delete __, которые вызываются при получении, установке или удалении объекта из словаря экземпляров.
В этом случае, когда вещь получается из экземпляра, мы привязываем первый аргумент его метода __call__ к экземпляру, используя частичное. Это делается автоматически для функций-членов при создании класса, но для синтетической функции-члена, подобной этой, нам нужно сделать это явно.