Доступ к атрибуту функции, созданному в декораторе вне этого декоратора

Я хочу посчитать, сколько раз была вызвана данная функция.

Итак, я сделалcountcalls декоратор, чтобы дать моим функциям__callcount атрибут, который увеличивается на каждый вызов. Достаточно просто.

Моя проблема заключается в получении__callcount значение обратно позже.

Вот мой код:

import functools

def countcalls(f):
    f.__callcount = 0

    @functools.wraps(f)
    def _countcalls(*args, **kwds):
        f.__callcount += 1
        print('  Called {0} time(s).'.format(f.__callcount))
        return f(*args, **kwds)
    return _countcalls

@countcalls
def fib(n):
    if n < 0:
        raise ValueError('n must be > 0')
    if n == 0 or n == 1:
        return 1

    return fib(n-1) + fib(n-2)

if __name__ == '__main__':
    print('Calling fib(3)...')
    x = fib(3)
    print('fib(3) = {0}'.format(x))

    print('Calling fib(3) again...')
    x = fib(3)
    print('fib(3) = {0}'.format(x))

    print('fib was called a total of {0} time(s).'.format(fib.__callcount)) 

Который генерирует следующий вывод (Python v3.3.0):

Calling fib(3)...
  Called 1 time(s).
  Called 2 time(s).
  Called 3 time(s).
  Called 4 time(s).
  Called 5 time(s).
fib(3) = 3
Calling fib(3) again...
  Called 6 time(s).
  Called 7 time(s).
  Called 8 time(s).
  Called 9 time(s).
  Called 10 time(s).
fib(3) = 3
fib was called a total of 0 time(s).

Почемуfib.__callcount равный0 на последней строке? Как показывает результат,__callcount увеличивается и сохраняется между вызовамиfib.

Чего мне не хватает?

Ответы на вопрос(4)

Ваш ответ на вопрос