Chỉ cần đưa ra ý kiến về việc liệu điều sau đây là hợp lý hay có cách tiếp cận tốt hơn. Về cơ bản tôi muốn một trang trí sẽ áp dụng cho một hàm hoặc một lớp thực hiện __call__.Trang trí python cho lớp HOẶC chức năng
Bạn chỉ có thể có trang trí thông thường và trang trí __call__ một cách rõ ràng nhưng sau đó trang trí được giấu bên trong định nghĩa lớp và ít rõ ràng hơn. Có lẽ tôi đang thiếu một giải pháp đơn giản hơn.
import types
from functools import wraps
class dec:
""" Decorates either a class that implements __call__
or a function directly.
"""
def __init__(self, foo):
self._foo = foo
def __call__(self, target):
wraps_class = isinstance(target, types.ClassType)
if wraps_class:
fun = target.__call__
else:
fun = target
@wraps(fun)
def bar(*args, **kwds):
val = args[1] if wraps_class else args[0]
print self._foo, val
return fun(*args, **kwds)
if wraps_class:
target.__call__ = bar
return target
else:
return bar
@dec('A')
class a:
# you could decorate here, but it seems a bit hidden
def __call__(self, val):
print "passed to a:", val
@dec('B')
def b(val):
print "passed to b:", val
a()(11)
b(22)
Cảm ơn. (Và nếu có ai quan tâm, DzinX lưu ý sửa lỗi để làm cho nó hoạt động với các lớp kiểu mới là kiểm tra với inspect.isclass.) –