Выдающиеся декораторы - PullRequest
       7

Выдающиеся декораторы

0 голосов
/ 28 сентября 2018

задача состоит в том, чтобы вызвать функцию 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 раза без вызова в основной программе.Почему это так?

1 Ответ

0 голосов
/ 28 сентября 2018

Потому что, когда вы делаете:

@my_decorator()
def printer_hp():
    ...

Это эквивалентно:

printer_hp = my_decorator()(printer_hp)

Поскольку my_decorator() возвращает wrapper, тогда оно эквивалентно:

printer_hp = wrapper(printer_hp)

И то, что делает wrapper, вызывает данную функцию 4 раза, поэтому printer_hp вызывается 4 раза сразу.

...