【发布时间】:2017-10-21 03:48:51
【问题描述】:
我在理解 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 变量吗?
【问题讨论】:
-
试试看吧!
-
我真的有点惊讶这个作品。我原以为它不会计算递归调用。
标签: python function oop decorator