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

10、python-装饰器

简介

作用:用一个新函数封装旧函数(是旧函数代码不变的情况下增加功能)然后会返回一个新函数,新函数就叫做装饰器

一.装饰器前生(闭包)

  1. 先执行w1()函数,返回inner函数
  2. 再执行inner()函数,inner()函数执行中会执行func()函数
  3. 执行func()函数,是由w1函数传进来的函数决定,这里执行func1()
def w1(func):def inner():print('正在验证权限...')func()return innerdef func1():print('------func1------')w1(func1)()

二.装饰器使用

def w1(func):def inner():print('正在验证权限...')func()return inner@w1
def func1():print('------func1------')func1()

三.多个装饰器的使用

def make_bold1(func):def wrapped():print('---1---')return "<b>" + func() + "</b>"return wrappeddef make_bold2(func):def wrapped():print('---2---')return "<i>" + func() + "</i>"return wrapped@make_bold1
@make_bold2
def test():print('---3---')return 'hello world'print(test())

四.装饰器固定参数传参

def w1(func):def inner(aa, bb):print('正在验证权限...')func(aa, bb)return inner@w1
def func1(a, b):print('------func1------{},{}'.format(a, b))func1(1, 2)

五.装饰器不定参数传参

def w1(func):def inner(*args, **kwargs):print('正在验证权限...')func(*args, **kwargs)return inner@w1
def func1(a, b):print('------func1------{},{}'.format(a, b))@w1
def func2(a, b, c):print('------func1------{},{},{}'.format(a, b, c))func1(1, 2)
func2(1, 2, 3)

六.装饰器带有返回值

def w1(func):def inner():print('正在验证权限...')r = func()return r + "456"return inner@w1
def func1():print('------func1------')return '123'print(func1())

七.带有参数的装饰器

def w_arg(a):def w1(func):def inner():print('正在验证权限...{}'.format(a))if a == '通过':print('验证通过')else:print('验证失败')func()return innerreturn w1@w_arg('通过')
def func1():print('------func1------')@w_arg('123')
def func2():print('------func2------')func1()
func2()

相关文章:

  • vscode中默认shell选择
  • VCG 基于CMake构建VCG项目
  • 基于STM/APM32F072制作的J-Link OB调试器项目验证
  • 使用webdriver-manager解决浏览器与驱动不匹配所带来自动化无法执行的问题
  • 劫持最新版 QQNT / QQ / TIM 客户端 ClientKeys
  • 第十章 创建Callout Library - 使用 B 链接类型传递短计数字符串
  • MySQL的事务隔离级别
  • LeetCode 394:字符串解码
  • latexshop 使用bug:xxx has a comma at the end
  • 子网掩码与IP段计算
  • java企业网站系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
  • PAT 乙级 1042 字符统计
  • 无需手动搜索!轻松创建IntelliJ IDEA快捷方式的Linux教程
  • Rosalind 035 Creating a Distance Matrix
  • 【科研】[3.番外篇] 常见基础科研词汇的介绍!非常基础的一期,大家选择观看哟~
  • SegmentFault for Android 3.0 发布
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 3.7、@ResponseBody 和 @RestController
  • C++类的相互关联
  • Git学习与使用心得(1)—— 初始化
  • golang 发送GET和POST示例
  • Java基本数据类型之Number
  • Js基础——数据类型之Null和Undefined
  • node学习系列之简单文件上传
  • Redis学习笔记 - pipline(流水线、管道)
  • SAP云平台里Global Account和Sub Account的关系
  • spring boot 整合mybatis 无法输出sql的问题
  • 第十八天-企业应用架构模式-基本模式
  • 构造函数(constructor)与原型链(prototype)关系
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 蓝海存储开关机注意事项总结
  • 力扣(LeetCode)56
  • 漂亮刷新控件-iOS
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 如何合理的规划jvm性能调优
  • 如何利用MongoDB打造TOP榜小程序
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 算法-插入排序
  • 我从编程教室毕业
  • 小程序测试方案初探
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 国内开源镜像站点
  • #大学#套接字
  • (2022 CVPR) Unbiased Teacher v2
  • (3)STL算法之搜索
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (独孤九剑)--文件系统
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (十八)三元表达式和列表解析
  • (十一)图像的罗伯特梯度锐化
  • (一)u-boot-nand.bin的下载
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)iOS字体
  • (转)linux下的时间函数使用