def decorator(fn):
def wrapper(*args, **kwargs):
print 'With sour cream and chives!',
return fn(*args, **kwargs)
return wrapper
class Potato(object):
def __call__(self):
print 'Potato @ {} called'.format(id(self))
spud = Potato()
fancy_spud = decorator(Potato())
Với mã này chúng ta có hai trường hợp của lớp callable, một được trang trí và một là đồng bằng:Tôi làm cách nào để trang trí một phiên bản của một lớp có thể gọi?
>>> spud()
Potato @ 140408136280592 called
>>> fancy_spud()
With sour cream and chives! Potato @ 140408134310864 called
Tôi tự hỏi nếu nó bằng cách nào đó được hỗ trợ để sử dụng cú pháp @decorator
trên callable cho chỉ là một ví dụ - trái với việc trang trí lớp/phương pháp, áp dụng cho mọi trường hợp. Theo this câu trả lời phổ biến, @syntax chỉ đường cho:
function = decorator(function)
Nhưng nó là một quá đơn giản? Với tất cả nỗ lực nửa nướng của tôi, dường như chỉ hoạt động khi cú pháp xảy ra trước def
, class
, khoảng trắng hoặc @another_decorator
.
@decorator
baked = Potato()
Đó là SyntaxError
.
baked = Potato()
@decorator
baked
Cũng SyntaxError
.
@decorator
def baked(_spud=Potato()):
return _spud()
Hoạt động, nhưng rất xấu và gian lận.