Понимание декораторов Python - это переменная в примере? - PullRequest
0 голосов
/ 30 апреля 2019

Я читаю следующий урок о Python-декораторах урок . Все более или менее понятно, кроме следующего кода:

def call_counter(func):
    def helper(x):
        helper.calls += 1
        return func(x)
    helper.calls = 0

    return helper

@call_counter
def succ(x):
    return x + 1


print(succ.calls)
for i in range(10):
    succ(i)

print(succ.calls)

Я не могу полностью понять helper.calls обозначения. Является ли переменная без отношения к helper функции? Также как функция succ получает доступ к calls?

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

В Python функции - это объекты, это означает, что вы также можете устанавливать переменные.

def func():
    pass

func.count = 0
print(func.count) # 0
func.count += 1
print(func.count) # 1
2 голосов
/ 30 апреля 2019

Мы можем переписать украшение следующим образом:

def succ(x):
    return x + 1

succ = call_counter(succ)

Так что теперь у вас есть украшенный succ.Как вы можете видеть в call_counter, он на самом деле возвращает функцию с именем helper.И эта helper функция имеет один атрибут с именем calls, который используется для подсчета вызовов.Так что теперь, когда вы вызываете succ(i), вы на самом деле вызываете эту helper функцию.

И да, calls - это просто нормальная переменная.

...