Pythonのクラスデコレータがどのように機能するかを理解することに問題があります。このケースでは、再帰関数(Greatest Common Divisorの検索)が何回呼び出されたかを数えるデコレータを作成したいと思います。クラスデコレータがPythonでどのように機能するかを理解する
class TrackCalls(object):
def __init__(self, func):
self.func = func
self.calls = 0
def __call__(self,*args,**kwargs):
self.calls += 1
return self.func(*args, **kwargs)
def called(self):
return self.calls
と機能::私はデコレータ持っ
@TrackCalls
def NWD(a, b):
if a > b:
return NWD(a-b, b)
elif b > a:
return NWD(a, b-a)
else:
return a
をし、私はそれらを呼び出す:
print(NWD(60,25)) #5
print(NWD.called()) #6
正確NWD機能で何が起こっていますか?私の知る限り、デコレータは関数を呼び出して別の関数を作ります。この場合、TrackCallsは関数をとり、TrackCallsクラスのオブジェクトを作成してから、NWD.called()
を呼び出すと、私は基本的にTrackCallsオブジェクトのメソッドを呼び出します。例えば私が走ったとき。 NWD(5,25)
前の呼び出しの後では11になるので、NWDを呼び出すたびに、何らかの静的変数を持つTrackCallsオブジェクトを呼び出すように見えます。私が同じデコレータで別の再帰関数を飾っていたら、calls
変数を共有しますか?
試してみてください! – jonrsharpe
私は正直なところ、この作品が少し驚いています。私はそれが再帰呼び出しを数えないと思ったでしょう。 –