用一个简单的 python 代码示例进行解释。如何装饰一个计算函数调用次数的函数?同时,如何正确组合递增函数本身?
def f():
counter = 0
if (f):
counter += 1
return counter
问题补充:例如,我们先处理函数本身,没有装饰器。为什么函数执行后我得到“1”?毕竟,该函数被调用了 3 次。
def f():
counter = 0
if (f):
counter += 1
return counter
f()
f()
f()
result = f()
print(result)
闭包是指嵌套函数可以使用在该函数之外声明的变量。并且,函数完成后,变量的值将保留在内存中,不会被删除。而且,每次调用函数时,当我们每次传递不同的参数时,每次都会显示不同的值。
装饰器是一种在不更改其代码的情况下向另一个函数添加新功能的函数。它有点包装、装饰功能,从而扩展了它的功能。装饰器是一个接受另一个函数并返回一个函数(闭包)的函数。
counter
是一个函数局部变量f
,每次调用该函数时它都会被设置为零。如果要存储值,请编写一个类并使用类或实例变量来存储变量的状态。在这里,我正在使用该类的一个实例:您还可以为 counter 使用全局变量
global counter
,因此对于初学者来说通常更容易:但是全局变量“乱扔”在程序内存中,与OOP的原理不太兼容,一般来说,最好不要使用它们,而是将特定的功能委托给特定的类来实现这些功能。当你正确使用类时,你有点保证类只改变它的内部状态,而当你使用全局变量时,任何函数都可以改变任何全局变量,因此很难发现和诊断错误,找出哪个函数以及程序的状态在什么时候发生了变化。
至于装饰器,我建议你把问题写清楚,因为装饰器已经被描述和分析过很多次了,如果你在现有的解释中有不明白的地方,请在问题中添加代码,并标记代码中难以理解的地方你。就像您对
f
问题中的功能所做的那样。不,好吧,你当然可以通过装饰器:
但是,这仍然是一种变态。如果你有一些状态需要被记住然后访问,那么最合乎逻辑的方法是使用一个类。究竟如何-已经写在另一个答案中。
好吧,除了已经说明的所有内容之外,还有一个装饰器类的示例。