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

1

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

  • 0
    Есть отличное (хотя и продолжительное) объяснение, которое действительно помогает понять декораторы: stackoverflow.com/questions/739654/…
Теги:
python-decorators

1 ответ

3
Лучший ответ

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

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

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

printer_hp = my_decorator()(printer_hp)

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

printer_hp = wrapper(printer_hp)

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

  • 0
    Набирал что-то похожее. Возможно, стоит добавить, что with () основном следует тому же поведению, что и декораторы с аргументами. Вот хорошая нить на этом: stackoverflow.com/questions/5929107/decorators-with-parameters Вы бы хотели, чтобы третья внешняя функция принимала аргументы декоратора; в этом случае нет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню