本文主要是介绍十二、装饰器 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.装饰器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!