Вы можете добавить атрибут _wrapped в партиал, который может быть тем, что вы уже сделали:
def __get__(self, obj, objtype):
"""Support instance methods."""
f = functools.partial(self.__call__, obj)
f._wrapped = self.func
return f
Или вы можете вернуть self.func вместо партиала, если obj равен None (то есть, если к нему обращаются из класса, а не из экземпляра):
def __get__(self, obj, objtype):
"""Support instance methods."""
if obj is None:
return self.func
else:
return functools.partial(self.__call__, obj)
Атрибут func
частичного является методом __call__
помеченного объекта. Если вы вызываете его из экземпляра Foo, то первый аргумент устанавливается в экземпляр obj частичным (см. Это в Foo (). Foo.args). Затем в memoized.__call__
self.func (* args) работает как метод связывания бедного человека.
Для lru_cache Рэймонд Хеттингер имеет Python 2-совместимые реализации, доступные как Рецепты кода ActiveState . Существует также версия для наименее часто используемых, в дополнение к наименее часто используемым.