十二、装饰器 1.装饰器
2021/12/15 6:17:42
本文主要是介绍十二、装饰器 1.装饰器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
装饰器
装饰器 decorator 在不改变原函数代码,且保持原函数调用方法不变的情况下,给原函数增加新的功能(或给类增加新的属性和方法) 核心思想 用一个函数/类去装饰原函数/类,创建出一个新的函数/类 语法 存在闭包和待修饰的函数 在定义原函数时使用 @ 引用装饰器函数,装饰器会把原函数作为参数传递到装饰器函数中,@ 符号也叫语法糖 应用场景 引入日志、统计函数执行时间、权限校验、缓存、执行函数前的初始化等 函数装饰器、类装饰器、类方法装饰器都是用来装饰函数的 本质:函数外无法直接调用内层函数 通过闭包,让原函数变量名引用内层函数,内层函数中接收的变量名引用原函数,此时原函数调用方式不变,内层函数中又保存了原函数
# 装饰器的底层实现 # 闭包函数 def outer(func): # 内层函数 def inner(): print('this is inner1') # 此时func指向old() func() print('this is inner2') return inner # 原函数 def old(): print('this is old func') # 新的old() # 此时old指向inner(),调用 old() 等同于调用 inner() old = outer(old) old() # 装饰器语法 # 此处把outer作为装饰器 @outer # 等同于 old = outer(old) ,此时无法再向 outer 传递其他参数 def old(): print('this is old func') old() this is inner1 this is old func this is inner2 this is inner1 this is old func this is inner2
# 使用装饰器统计函数执行时间 # 定义装饰器函数 def runtime(f): # 内层函数 def inner(): time_start = time.perf_counter() f() time_end = time.perf_counter() - time_start print(time_end) return inner # 需要使用装饰器的原函数 @runtime def run(): for i in range(5): print(i,end=' ') time.sleep(0.5) run() 0 1 2 3 4 2.519227228
这篇关于十二、装饰器 1.装饰器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-26手写消息中间件:从零开始的指南
- 2024-11-26Java语音识别项目资料:新手入门教程
- 2024-11-26JAVA语音识别项目资料:新手入门教程
- 2024-11-26Java语音识别项目资料:入门与实践指南
- 2024-11-26Java云原生资料入门教程
- 2024-11-26Java云原生资料入门教程
- 2024-11-26Java云原生资料:新手入门教程
- 2024-11-25Java创意资料:新手入门的创意学习指南
- 2024-11-25JAVA对接阿里云智能语音服务资料详解:新手入门指南
- 2024-11-25Java对接阿里云智能语音服务资料详解