Если вы можете написать функцию для реализации вашего декоратора, вы должны предпочесть ее.Но не все декораторы могут быть легко написаны как функции - например, когда вы хотите сохранить какое-то внутреннее состояние.
class counted(object):
""" counts how often a function is called """
def __init__(self, func):
self.func = func
self.counter = 0
def __call__(self, *args, **kwargs):
self.counter += 1
return self.func(*args, **kwargs)
@counted
def something():
pass
something()
print something.counter
Я видел, как люди (включая меня) прилагают смешные усилия, чтобы писать декораторы толькофункции.Я до сих пор не понимаю, почему издержки класса обычно совершенно незначительны.