当前位置: 首页 > news >正文

系统学习Python——装饰器:函数装饰器-[装饰器状态保持方案:外层作用域和全局变量]

分类目录:《系统学习Python》总目录


闭包函数(带有外围def作用域引用和嵌套的def)常常可以实现相同的效果,特别是用于像被装饰的最初咱数这样的静态数据时。然而在下面这个例子中,我们也需要外层作用域中的一个计数器,它随着每次调用而改变,而这在Python2.X中是不可能的。在Python2.X中,我们仍可以依据前面文章使用的类和属性,或选择其他方案。使用声明把状态变量移出到全局作用域是一个备选项,并且在Python2.X和Python3.X中都能够工作:

calls = 0def tracer(func):def wrapper(, *args, **kwargs):global 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)

遗憾的是,把计数器移出到共同的全局作用域会允许像这样修改它们,这也意味着它们将为每个被包装函数所共享。和类实例属性不同,全局计数器是跨程序的,而不是针对每个函数的一一对于任何跟踪的函数调用,计数器都会递增。如果你比较这个版本与前一个版本的输出,就可以看出其中的区别一一单个并共享的全局调用计数器在每个被装饰函数调用时都会更新,这是不对的:
输出结果

参考文献:
[1] Mark Lutz. Python学习手册[M]. 机械工业出版社, 2018.

http://www.lryc.cn/news/269382.html

相关文章:

  • Tekton
  • 2023,TEVC,A Competitive and Cooperative Swarm Optimizer for Constrained MOP
  • java设计模式学习之【中介者模式】
  • C++三剑客之std::variant(一)
  • 新火种AI|AI正在让汽车成为“消费电子产品”
  • Docker六 | Docker Compose容器编排
  • Oraclelinux部署Oracle服务
  • Ubuntu安装K8S(1.28版本,基于containrd)
  • Linux 线程安全 (2)
  • 异或运算^简述
  • Google Play上架:2023年度总结报告
  • JAVA进化史: JDK10特性及说明
  • 第二百三十四回
  • {MySQL} 数据库约束 表的关系 新增删除 修改 查询
  • 【JVM】虚拟机的组成+字节码文件组成+类的生命周期
  • pip 下载太慢的解决办法,pip换国内源,pip换源
  • OKCC语音机器人的人机耦合来啦
  • 有序数组的平方
  • Java虚拟机中的垃圾回收
  • Vscode新手安装与使用
  • 以元旦为题的诗词(二)
  • 饥荒Mod 开发(二一):超大便携背包,超大物品栏,永久保鲜
  • js 七种继承方法
  • Unity Shader 实现X光效果
  • Android Camera相关类功能整理
  • 3、Git分支操作与团队协作
  • Linux网卡配置
  • wireshark access/trunk/hybrid报文分析
  • C++ Primer Plus----第十二章--类和动态内存分布
  • 清理 Oracle Arch 目录中的日志文件