class Person(metaclass=decorateAll(timer(label='***'))): # Применяет деократор timer, def __init__(self, name, pay): # с аргументами self.name = name self.pay = pay def giveRaise(self, percent): self.pay *= (1.0 + percent) def lastName(self): return self.name.split()[-1]
def listcomp(N): # Like listcomp = timer(...)(listcomp) return [x * 2 for x in range(N)] # listcomp(...) triggers Timer.__call__ @timer(trace=True, label='[MMM]==>')
def giveRaise(self, percent): # giveRaise = timer()(giverRaise) self.pay *= (1.0 + percent) # tracer remembers giveRaise @timer(label='**')
setattr(aClass, attr, decorator(attrval)) # Не __dict__ return aClass return DecoDecorate @decorateAll(tracer) # Используется декоратор класса class Person: # Применяет декоратор func к методам def __init__(self, name, pay): # Person = decorateAll(..)(Person) self.name = name # Person = DecoDecorate(Person) self.pay = pay def giveRaise(self, percent): self.pay *= (1.0 + percent) def lastName(self): return self.name.split()[-1] bob = Person('Bob Smith', 50000) sue = Person('Sue Jones', 100000) print(bob.name, sue.name) sue.giveRaise(.10) print(sue.pay) print(bob.lastName(), sue.lastName()) @decorateAll(tracer) # Декорирует все методы декоратором tracer @decorateAll(timer()) # Декорирует все методы декоратором timer со значениями # аргументов по умолчанию defaults @decorateAll(timer(label='@@')) # То же самое, но определяет # аргумент декоратора ##################################################