本文主要是介绍系统学习Python——装饰器:函数装饰器-[装饰器状态保持方案:外层作用域和非局部变量],希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
分类目录:《系统学习Python》总目录
我们在某些情况下可能想要共享全局状态。如果我们真的想要每个函数都有自己的计数器,要么像前面的文章那样使用类,要么使用Python3.X中的闭包函数(工厂函数)和nonlocal
语句。由于这条新语句允许修改外层函数作用域变量,因此这些变量可以充当每次装饰各自拥有的可修改数据。下面的代码仅在Python3.X中运行:
def tracer(func):calls = 0def wrapper(*args, **kwargs):nonlocal callscalls += 1print('call %s to %s' % (calls, func.__name__))return func(*args, **kwargs)return wrapper@tracer
def spam(a, b, c):print(a + b + c)@tracer
def eggs(s, y):print(x ** y)span(1, 2, 3)
span(a=4, b=5, c=6)
eggs(2, 16)
eggs(4, y=4)
现在,由于外层作用域变量不能跨程序而成为全局的,因此每个被包装函数再次有了自己的计数器,就像是用类和属性实现的一样。这里是在3.X下运行后新的输出:
参考文献:
[1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.
这篇关于系统学习Python——装饰器:函数装饰器-[装饰器状态保持方案:外层作用域和非局部变量]的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!