Python进阶(六)----装饰器

mac2022-06-30  57

Python进阶(六)----装饰器

一丶开放封闭原则

开放原则:

​ 增加一些额外的新功能

封闭原则:

​ 不改变源码.以及调用方式

二丶初识装饰器

装饰器:

​ 也可称装饰器函数,诠释开放封闭原则,装饰器的本质是闭包

###普通版装饰器 import time def timmer(x): # x 接收的原函数的内存地址 def inner(): start_time=time.time() x() # 执行 原函数 print(f'执行效率{time.time()-start_time}') return inner def index(): time.sleep(2) print(f'欢迎访问本站博客园') index=timmer(index) #将timmer函数执行的结果返回,付给index变量 index() #这里执行的inner函数 ###标准版 @timmer是语法糖(黏贴在被装饰函数,先于执行被装饰函数),装饰器函数必写在被装饰函数之上. import time def timmer(func): # 此时 func 就是一个自由变量 def inner(): start_time = time.time() func() # func 是timmer函数传递过来的index原函数的内存地址 print(f'执行效率 {time.time() - start_time}') return inner @timmer # 等同于 index=timmer(index) 往下读一行 def index(): time.sleep(2) print('登录成功') index() #这里执行的inner函数

三丶被装饰函数带返回值

###需求被装饰函数有返回值 import time def timmer(func): # 这里argv 接收的真正要执行的原函数. def inner(): start_time=time.time() var=func() print(f'{time.time()-start_time},{args[0]},{args[1]}') return var #原函数有返回值, 这里是执行完 inner函数 中真正要返回的原函数执行的结果 return inner @timmer def index(*args,**kwargs): time.sleep(2) print('进入到网页index页面') return True # 原函数 最重返回的结果是 True print(index(1,2)) # 这里是执行 inner方法

四丶被装饰函数带参数

###需求 被装饰函数有参数 import time def timmer(func): def inner(*args,**kwargs): # inner方法执行,接收的参数, 将形参参数聚合 args=(1,2) # 函数定义时 , * ,** 代表聚合 start_time=time.time() res=func(*args,**kwargs) # 执行真正的原函数, 将参数打散 func(1,2) # 函数执行时 ,* ,** 代表打散 print(f'{time.time()-start_time} 这是{args[0]}') return res return inner @timmer def index(args): time.sleep(2) print(f'welcome {args}') return True index('都来看')

五丶标准终终结版装饰器

###### 装饰器原版 #### def warpper(func): def inner(*args,**kwargs): '''被装饰器之前的操作''' ret=func(*args,**kwargs) '''被装饰函数之后的操作''' return ret return inner ####拓展版 计算index函数执行的效率 import time def timmer(func): def inner(*args,**kwargs): # inner方法执行,接收的参数, 将形参参数聚合 args=(1,2) # 函数定义时 , * ,** 代表聚合 start_time=time.time() res=func(*args,**kwargs) # 执行真正的原函数, 将参数打散 func(1,2) # 函数执行时 ,* ,** 代表打散 print(f'{time.time()-start_time} 这是{args[0]}') return res #原函数有返回值, 这里是执行完 inner函数 中真正要返回的原函数执行的结果 return inner #返回inner函数, 给index重新赋值. @timmer #语法糖,等同于 index=timmer(index) , 把index原函数作为形参传递给timmer函数func def index(args): # 原函数具有传参的功能 time.sleep(2) print(f'welcome {args}') return True # 原函数具有返回值的功能 index('都来看') # 执行的是inner函数,把参数传递给inner函数, ####装饰器: #1.必须存在嵌套函数中 #2.必须存在内存函数对外层函数(非全局变量)的引用 #3.必须具有return 返回嵌套函数的内存地址(嵌套函数名字) #4.内层函数必须能够接收原函数传递的参数 #5.内存函数执行完必须返回原函数要返回的结果 ####装饰器约束: #1.不得更改源码, #2.不能更改调用方式 ####应用场景: #用户登录验证 #打印日志

转载于:https://www.cnblogs.com/dengl/p/11077606.html

最新回复(0)