Каков жизненный цикл атрибута функции? - PullRequest
0 голосов
/ 10 апреля 2020

Я видел в сети код, подсчитывающий количество вызовов функции с помощью декораторов. Ниже приведен код:

import functools

def count_calls(func):
    @functools.wraps(func)
    def wrapper_count_calls(*args, **kwargs):
        wrapper_count_calls.num_calls += 1
        print(f"Call {wrapper_count_calls.num_calls} of {func.__name__!r}")
        return func(*args, **kwargs)
    wrapper_count_calls.num_calls = 0
    return wrapper_count_calls

@count_calls
def say_whee():
    print("Whee!")

@count_calls
def say_whoo():
    print("Whoo!")

say_whee()
say_whee()
say_whee()
say_whoo()
say_whoo()
say_whoo()

Вывод приведенного выше кода:

Call 1 of 'say_whee'
Whee!
Call 2 of 'say_whee'
Whee!
Call 3 of 'say_whee'
Whee!
Call 1 of 'say_whoo'
Whoo!
Call 2 of 'say_whoo'
Whoo!
Call 3 of 'say_whoo'
Whoo!

Но атрибут функции "wrapper_count_calls.num_calls" является общим для функций "say_whee" и "say_whoo". Тогда почему счетчик сбрасывается? Разве это не должно начинаться с 4 для say_whoo?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...