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

Python 函数装饰器和闭包(装饰器基础知识)

本章内容:
Python 如何计算装饰器句法
Python 如何判断变量是不是局部的
闭包存在的原因和工作原理
nonlocal 能解决什么问题
掌握这些基础知识后,我们可以进一步探讨装饰器:
实现行为良好的装饰器
标准库中有用的装饰器
实现一个参数化装饰器

装饰器基础知识

装饰器是可调用的对象,其参数是另一个函数(被装饰的函数)。 装
饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个
函数或可调用对象。
假如有个名为 decorate 的装饰器:

@decorate
def target():print('running target()')

上述代码的效果与下述写法一样:

def target():print('running target()')
target = decorate(target)

两种写法的最终结果一样:上述两个代码片段执行完毕后得到的
target 不一定是原来那个 target 函数,而是 decorate(target) 返
回的函数。

为了确认被装饰的函数会被替换,请看示例 7-1 中的控制台会话。
示例 7-1 装饰器通常把函数替换成另一个函数

def deco(func):def inner():print('running inner()')return inner()@deco
def target():print('running target')>>> target() ➌
running inner()
>>> target ➍
<function deco.<locals>.inner at 0x10063b598>

❶ deco 返回 inner 函数对象。
❷ 使用 deco 装饰 target。
❸ 调用被装饰的 target 其实会运行 inner。
❹ 审查对象,发现 target 现在是 inner 的引用。

严格来说,装饰器只是语法糖。如前所示,装饰器可以像常规的可调用
对象那样调用,其参数是另一个函数。有时,这样做更方便,尤其是做
元编程(在运行时改变程序的行为)时。

综上,装饰器的一大特性是,能把被装饰的函数替换成其他函数。第二
个特性是,装饰器在加载模块时立即执行。

相关文章:

  • 文献阅读篇#5:5月一区好文阅读,BFA-YOLO,用于建筑信息建模!(上)
  • 新一代机载相控阵雷达的发展
  • 「Mac畅玩AIGC与多模态12」开发篇08 - 使用自定义汇率查询插件开发智能体应用
  • 【 Node.js】 Node.js安装
  • Java 期中考试练习题
  • 【速写】prune与activate
  • 解决Win10虚拟机“网络连接不上”,“Ethernet0 网络电缆被拔出”的问题
  • PB的框架advgui反编译后控件无法绘制的处理(即导入pbx的操作步骤)
  • 【漫话机器学习系列】234.阈值类特征的方差分析(Thresholding Categorical Feature Variance)
  • 分布式锁的几种实现
  • 【MySQL数据库】视图
  • ESP-ADF esp_dispatcher组件之audio_service子模块连接管理函数详解
  • 艾尔登法环最新3000+MOD大型整合包 5月最新更新
  • 伽利略如何测量光速?一场跨越山头的失败实验
  • 用spring-boot-maven-plugin打包成单个jar有哪些缺点优化方案
  • 最长公共前缀(14)
  • 【STM32】ADC的认识和使用——以STM32F407为例
  • 力扣面试150题--旋转链表
  • 蓝桥杯 7. 晚会节目单
  • ctfshow web入门 web46
  • 人民日报:上海“模速空间”何以汇聚超百家大模型企业
  • 航海王亚洲巡展、工厂店直销……上海多区推出“五五购物节”活动
  • 十二届上海市委第六轮巡视全面进驻,巡视组联系方式公布
  • “80后”商洛市委副书记、市政府党组副书记赵孝任商洛市副市长
  • 广东省副省长刘红兵任湖南省委常委、宣传部部长
  • 泽连斯基承认乌情报部门刺杀俄军高官