задача состоит в том, чтобы вызвать функцию 4 раза с помощью декоратора. Решение:
def my_decorator (func):
def wrapper():
func()
func()
func()
func()
return wrapper
@my_decorator
def printer_hp():
print('I am printer HP 4700 LaserJet')
return 0
printer_hp()
ОДНАКО, если я перейду func к аргументам обертки и поставлю круглые скобки для @my_decorator:
def my_decorator ():
def wrapper(func):
func()
func()
func()
func()
return wrapper
@my_decorator()
def printer_hp():
print('I am printer HP 4700 LaserJet')
return 0
функция вызывается автоматически 4 раза, не вызывая ее в основной программе. Это почему?
Потому что, когда вы это делаете:
@my_decorator()
def printer_hp():
...
Это эквивалентно:
printer_hp = my_decorator()(printer_hp)
Поскольку my_decorator()
возвращает wrapper
, она эквивалентна:
printer_hp = wrapper(printer_hp)
И то, что делает wrapper
, вызывает эту функцию 4 раза, поэтому printer_hp
вызывается сразу 4 раза.
()
основном следует тому же поведению, что и декораторы с аргументами. Вот хорошая нить на этом: stackoverflow.com/questions/5929107/decorators-with-parameters Вы бы хотели, чтобы третья внешняя функция принимала аргументы декоратора; в этом случае нет.