Я новичок в декораторах python. Я понял основные понятия с помощью простых примеров. Но когда я попытался прочитать этот более практичный декоратор, я чувствую себя потерянным. Ниже приведен код, а затем мои вопросы:Невозможно понять этот декоратор 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 called'
Является @countcalls
эквивалентно созданию countcalls
объекта и передавая функцию ниже его метода __init__
?
__call__
принимает три аргумента.self
в порядке, если на вопрос выше ответили. Какого черта есть два других аргумента:*args, **kwargs
и что они достигают?Как я могу стать лучше на декораторах?
один из моих фаворитов: http://stackoverflow.com/q/739654/1025391 – moooeeeep
Руководство по быстрому стилю, не используйте двойное подчеркивание для личных переменных, используйте только один. –
@ChinmayKanchi: двойное подчеркивание имеет особое значение в Python; [это приводит к искажению имен] (http://docs.python.org/reference/expressions.html#atom-identifiers). –