Python类的functools.wraps的等价功能
Python类的functools.wraps的等价功能
在使用类定义装饰器时,如何自动传递__name__
、__module__
和__doc__
?通常情况下,我会使用functools中的@wraps装饰器。下面是我为一个类所做的(这不完全是我的代码):
class memoized: """Decorator that caches a function's return value each time it is called. If called later with the same arguments, the cached value is returned, and not re-evaluated. """ def __init__(self, func): super().__init__() self.func = func self.cache = {} def __call__(self, *args): try: return self.cache[args] except KeyError: value = self.func(*args) self.cache[args] = value return value except TypeError: # uncacheable -- for instance, passing a list as an argument. # Better to not cache than to blow up entirely. return self.func(*args) def __repr__(self): return self.func.__repr__() def __get__(self, obj, objtype): return functools.partial(self.__call__, obj) __doc__ = property(lambda self:self.func.__doc__) __module__ = property(lambda self:self.func.__module__) __name__ = property(lambda self:self.func.__name__)
是否有一个标准的装饰器可以自动创建名称、模块和文档?还有,如何自动化get方法(我假设这是为了创建绑定方法?)?是否有任何缺少的方法?