我是 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
到底是什么:它们的目的是什么?我怎样才能在装饰师方面做得更好?