私は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__
3つの議論を取っています。self
上記の質問に答える限りは問題ありません。他の2つの議論は一体何ですか:*args, **kwargs
そして彼らは何を達成していますか?どうすればデコレータを上手にできますか?