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.不能更改调用方式
####应用场景:
#用户登录验证
#打印日志