Wystawianie opinii na temat tego, czy jest to uzasadnione, czy też jest lepsze podejście. Zasadniczo chcę dekoratora, który będzie dotyczył funkcji lub klasy, która implementuje __call__.dekorator pytonów dla klasy LUB funkcji
Można po prostu mieć zwykłego dekoratora i dekorować __call__ jawnie, ale wtedy dekorator jest schowany w definicji klasy i jest mniej oczywisty. Być może brakuje mi prostszego rozwiązania.
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)
Dzięki. (Jeśli ktokolwiek jest zainteresowany, DzinX odnotowuje poprawkę, aby działała z klasami nowego stylu, jest sprawdzenie za pomocą inspect.isclass.) –