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

Python装饰器的专业解释

装饰器,其实是用到了闭包的原理来进行操作的。

单个装饰器:

以下是一个简单的例子:

def outer(func):print("OUTER enter ...")def wrapper(*args, **kwargs):print("调用之前......")result = func(*args, **kwargs)print("调用之后......")return resultprint("OUTER leave ...")return wrapper@outer
def my_hello():print("hello world")

上面的代码可以运行出结果:

这个时候就会把这个闭包创建出来。

当我们调用my_hello函数的时候,会进行执行wrapper里的代码:

def outer(func):print("OUTER enter ...")def wrapper(*args, **kwargs):print("调用之前......")result = func(*args, **kwargs)print("调用之后......")return resultprint("OUTER leave ...")return wrapper@outer
def my_hello():print("hello world")my_hello()

调用原理:

等价于:

def outer(func):print("OUTER enter ...")def wrapper(*args, **kwargs):print("调用之前......")result = func(*args, **kwargs)print("调用之后......")return resultprint("OUTER leave ...")return wrapper# @outer
def my_hello():print("hello world")my_hello = outer(my_hello)
my_hello()

多重装饰器修饰:

def outer1(func):print("OUTER enter ...1")def wrapper(*args, **kwargs):print("调用之前......1")result = func(*args, **kwargs)print("调用之后......1")return resultprint("OUTER leave ...1")return wrapperdef outer2(func):print("OUTER enter ...2")def wrapper(*args, **kwargs):print("调用之前......2")result = func(*args, **kwargs)print("调用之后......2")return resultprint("OUTER leave ...2")return wrapper@outer1
@outer2
def my_hello():print("hello world")

打印的结果如下:

调用的时候:

def outer1(func):print("OUTER enter ...1")def wrapper(*args, **kwargs):print("调用之前......1")result = func(*args, **kwargs)print("调用之后......1")return resultprint("OUTER leave ...1")return wrapperdef outer2(func):print("OUTER enter ...2")def wrapper(*args, **kwargs):print("调用之前......2")result = func(*args, **kwargs)print("调用之后......2")return resultprint("OUTER leave ...2")return wrapper@outer1
@outer2
def my_hello():print("hello world")my_hello()

运行结果为:

调用原理:

def outer1(func):print("OUTER enter ...1")def wrapper(*args, **kwargs):print("调用之前......1")result = func(*args, **kwargs)print("调用之后......1")return resultprint("OUTER leave ...1")return wrapperdef outer2(func):print("OUTER enter ...2")def wrapper(*args, **kwargs):print("调用之前......2")result = func(*args, **kwargs)print("调用之后......2")return resultprint("OUTER leave ...2")return wrapper# @outer1
# @outer2
def my_hello():print("hello world")my_hello = outer2(my_hello)
my_hello = outer1(my_hello)my_hello()

运行结果如下:

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

相关文章:

  • vue3框架笔记
  • pytest --collectonly 收集测试案例
  • dev express 15.2图表绘制性能问题(dotnet绘图表)
  • WorkPlus:领先的IM即时通讯软件,打造高效沟通协作新时代
  • 学习SpringCloud微服务
  • WPF 显示气泡提示框
  • L1-062:幸运彩票
  • python+vue高校体育器材管理信息系统5us4g
  • 10 款顶级的免费U盘数据恢复软件(2024 年 更新)
  • C# json 转匿名对象及C#关键字的处理
  • 关于彻底通过外网,自动批量下载Python的pip依赖包后到企业内网重安装的步骤-比单个包的要方便多了。
  • Oracle T4-4小型机上配置Ldom部署rac
  • 【2023Hadoop大数据技术应用期末复习】填空题题型整理
  • 劫持 PE 文件:新建节表并插入指定 DLL 文件
  • HTTP分数排行榜
  • Android 实现 Slots 游戏旋转效果
  • AI产品经理 - 如何做一款软硬协同AI产品
  • 拒绝采样(算法)总结
  • 分布式数据库事务故障恢复的原理与实践
  • Spark中的数据加载与保存
  • 2023-12-20 LeetCode每日一题(判别首字母缩略词)
  • C# 事件(Event)
  • 2312d,d的sql构建器
  • 以太网二层交换机实验
  • 启封涂料行业ERP需求分析和方案分享
  • 华为ensp网络设计期末测试题-复盘
  • Dockerfile: WORKDIR vs VOLUME
  • spring ioc源码-refresh();
  • 使用递归实现深拷贝
  • 工程(十七)——自己数据集跑R2live