Я новичок в декораторах Python. Я понял основные понятия с помощью простых примеров. Но когда я попытался прочитать этот более практичный декоратор, я потерялся. Ниже приведен код, за которым следуют мои вопросы:
class countcalls(object):
"Decorator that keeps track of the number of times a function is called."
__instances = {}
def __init__(self, f):
self.__f = f
self.__numcalls = 0
countcalls.__instances[f] = self
def __call__(self, *args, **kwargs):
self.__numcalls += 1
return self.__f(*args, **kwargs)
def count(self):
"Return the number of times the function f was called."
return countcalls.__instances[self.__f].__numcalls
@countcalls
def f():
print 'f called'
f()
f()
f()
print f.count() # prints 3
Мои сомнения:
Когда мы добавляем префикс декоратора к функции, означает ли это, что мы создаем объект класса декоратора прямо здесь? В нашем случае, когда он говорит:
@countcalls
def f():
print 'f callers'
Является ли @countcalls
эквивалентным созданию объекта countcalls
и передаче приведенной ниже функции в его метод __init__
?
__call__
принимает три аргумента. self
подходит, если на поставленный выше вопрос дан ответ. Какого черта два других аргумента: *args, **kwargs
и чего они достигают?
Как стать лучше в декораторах?