Khi xác định trang trí bằng cách sử dụng một lớp, làm cách nào để tự động chuyển qua __name__
, __module__
và __doc__
? Thông thường, tôi sẽ sử dụng trang trí @wraps từ functools. Đây là những gì tôi đã làm thay vì cho một lớp học (đây không phải là hoàn toàn mã của tôi):Tương đương Python functools.wraps cho các lớp
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__)
Có trang trí chuẩn để tự động tạo mô-đun tên và tài liệu không? Ngoài ra, để tự động hóa phương thức get (tôi giả sử đó là để tạo các phương thức bị ràng buộc?) Có phương pháp nào bị thiếu không?
' __name__' và '__doc__' được đặt trên _instance_ , nhưng không phải là lớp, đó là những gì luôn được sử dụng bởi 'help (instance)'. Để khắc phục, việc triển khai trang trí dựa trên lớp không thể được sử dụng và thay vào đó, trình trang trí phải được thực hiện như một hàm. Để biết chi tiết, hãy xem http://stackoverflow.com/a/25973438/1988505. –
Phải, điều này không làm việc để được giúp đỡ (fibonacci) –
Tôi không chắc tại sao câu trả lời của tôi đột nhiên bị đánh dấu xuống ngày hôm qua. Không ai hỏi về việc giúp đỡ() để làm việc. Trong 3.5, inspect.signature() và inspect.from_callable() có một tùy chọn follow_wrapped mới; có lẽ giúp đỡ() nên làm như vậy? – samwyse