Не могу понять этот декоратор 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

Мои сомнения:

  1. Когда мы добавляем префикс декоратора к функции, означает ли это, что мы создаем объект класса декоратора прямо здесь? В нашем случае, когда он говорит:

    @countcalls def f(): print 'f callers'

Является ли @countcallsэквивалентным созданию объекта countcallsи передаче приведенной ниже функции в его метод __init__?

  1. __call__принимает три аргумента. selfподходит, если на поставленный выше вопрос дан ответ. Какого черта два других аргумента: *args, **kwargsи чего они достигают?

  2. Как стать лучше в декораторах?

5
задан ritratt 26 June 2012 в 20:06
поделиться