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

python装饰器嵌套基础

1 python装饰器嵌套基础

python支持装饰器嵌套,即多个装饰器装饰同一个函数或方法。

1.1 嵌套执行顺序

用法

@a_deco
@b_deco
@c_deco
def test_nest_deco():pass

描述

@a_deco、@b_deco、@c_deco分别占一行,编写在同一个函数或方法的def语句上方。

从def开始,由近到远,依次执行装饰器@c_deco、@b_deco、@c_deco。

等价于

test_nest_deco=a_deco(b_deco(c_deco(test_nest_deco))))

示例

>>> def a_decorator(func):print('a_decorator 被调用')return func
>>> def b_decorator(func):print('b_decorator 被调用')return func
>>> def c_decorator(func):print('c_decorator 被调用')return func
>>> @a_decorator
@b_decorator
@c_decorator
def test_nest_deco():print('test_nest_deco 被调用')c_decorator 被调用
b_decorator 被调用
a_decorator 被调用
>>> test_nest_deco()
test_nest_deco 被调用

1.2 嵌套返回调用对象

描述

装饰器的包装函数,比如a_wrapper(),保存接收到的入参函数,以便包装器调用。

最后执行的包装器a_decorator(),会将返回的包装器a_wrapper赋值给主函数变量名test_nest_deco。

调用主函数test_nest_deco()时,相当于调用最后的包装器a_wrapper()。

示例

>>> def a_decorator(func):print('a_decorator 被调用')def a_wrapper():print(func.__name__.center(50,'='))func()return '返回 a_decorator'return a_wrapper>>> def b_decorator(func):print('b_decorator 被调用')def b_wrapper():print(func.__name__.center(50,'='))func()return '返回 b_decorator'return b_wrapper>>> def c_decorator(func):print('c_decorator 被调用')def c_wrapper():print(func.__name__.center(50,'='))func()return '返回 c_decorator'return c_wrapper>>> @a_decorator
@b_decorator
@c_decorator
def test_nest_deco():print('test_nest_deco 被调用')c_decorator 被调用
b_decorator 被调用
a_decorator 被调用
>>> test_nest_deco()
====================b_wrapper=====================
====================c_wrapper=====================
==================test_nest_deco==================
test_nest_deco 被调用
'返回 a_decorator'
>>> test_nest_deco.__name__
'a_wrapper'
http://www.lryc.cn/news/277615.html

相关文章:

  • C语言之三子棋小游戏的应用
  • 优雅处理并发:Java CompletableFuture最佳实践
  • 熟悉HDFS常用操作
  • Adobe XD是什么?探索这款创新的用户体验设计工具
  • java常用应用程序编程接口(API)——ArrayList概述及使用案例
  • 2024年了,Layui再战三年有问题不?
  • 消息队列-RocketMQ-概览与搭建
  • Vue3技术解析(小册子)
  • 即将消失的五种编程语言?
  • c++学习:STL库(框架)+字符串模板类string+vector容器+list链表
  • 2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷④
  • 使用Scikit Learn 进行识别手写数字
  • GB/T 15036-2018 实木地板检测
  • 基于ElementUI封装的下拉树选择可搜索单选多选清空功能
  • 计算机网络-各层协议
  • LeetCode 84:柱状图中的最大矩形
  • 老生重谈:大模型的「幻觉」问题
  • golang实现skiplist 跳表
  • 尝试OmniverseFarm的最基础操作
  • 第28关 k8s监控实战之Prometheus(二)
  • 基于 SpringBoot + magic-api + Vue3 + Element Plus + amis3.0 快速开发管理系统
  • Kafka(四)Broker
  • 代码随想录第五十二天——最长递增子序列,最长连续递增序列,最长重复子数组
  • 【大数据架构】OLAP实时分析引擎选型
  • 代码随想录刷题题Day29
  • CVE-2023-51385 OpenSSH ProxyCommand命令注入漏洞
  • 如何寻找到相对完整的真正的游戏的源码 用来学习?
  • 数模学习day11-系统聚类法
  • SpringBoot+Redis实现接口防刷功能
  • TensorRT加速推理入门-1:Pytorch转ONNX