装饰器:在不改变被装饰对象‘内部代码’以及‘调用方式’的基础上添加新的功能
原则:开放封闭原则,对扩展开放,对修改封闭。
**装饰器重在函数相关知识对整合
装饰器简单了解使用
import time
def bigg():
time.sleep(3)#8
print('我是大哥') #9 3秒之后打印
def small():
time.sleep(1)
print('我是小弟')
def outer(func):
def all(): # 2
start_time = time.time() #6
func()#7 #10 func==bigg//func==small func变量名
end_time = time.time() #11
print('函数运行的时间%s' % (end_time - start_time)) #12
return all #3
bigg = outer(bigg) #4bigg
bigg() #5 #13
small=outer(small)
small()
总结:赋值一个变量名用来灵活绑定各个需要调用的变量名(变量)。
装饰器进阶
解决参数问题以及返回值
添加形参*args和**kwargs,接住即将填入返回的实参。
import time
def index():
time.sleep(3)
print('亚洲最大的线上赌场开业了 裸体美女在线发牌!!!')
def people(name):
time.sleep(1)
print('%s正在发牌' % name)
def outer(func):
def get_time(*args, **kwargs):
start_time = time.time()
func(*args, **kwargs)
end_time = time.time()
print('每张牌发布时间:%s' % (end_time - start_time))
return get_time
index = outer(index)
index()
people = outer(people)
people('Evelyn')
案例:用户认证装饰器
代码演示:
#用户认证装饰器,校验用户名和密码
#记录用户的状态
#3个状态3个def
import time
def cash():
time.sleep(1)
print('你的余额还有999999元啊')
def shop():
time.sleep(2)
print('你今年双十一贡献了250000元整')
def box():
time.sleep(3)
print('你的衣柜已经装不下了!不要在买啦!!')
#定义一个用于记录用户是否登陆的数据
is_login={'is_login':False}
print(type(is_login))
#共同代码的部分,用户登陆以及登陆状态的判定
def index(func):
def auth(*args,**kwargs):#2
# 2.判断用户是否已经登陆,如果没有这句判定,每个指令用户都会在登陆一遍
if is_login.get('is_login'):
res = func(*args, **kwargs)
return res
#1.先获取用户的用户名和密码
username=input('登陆你的用户名:').strip()
pwd=input('登陆你的密码:').strip()
#校验用户名和密码是否正确
if username=='Bella' and pwd=='123':
#正确执行函数
res=func(*args,**kwargs)
# 登陆成功修改用户的登陆状态
is_login['is_login']=True
return res
else:
print('用户名或密码错误,请填写正确的指令')
return auth#3
cash=index(cash)#4
cash()#5
shop=index(shop)
shop()
box=index(box)
box()
装饰器固定模版
def outer(func):
def inner(*args,**kwargs):
print('执行函数之前可以添加的额外功能')
res=func(*args,**kwargs)#执行被装饰的函数
print(''执行函数之后可以添加的额外功能)
return res#将被装饰函数执行之后的返回值返回
return inner
语法糖
装饰器语法糖是写规范
语法糖必须紧贴在被装饰对象的上方
装饰器语法糖内部原理
会自动将下面紧贴着的被装饰对象名字当做参数传给装饰器函数调用
@outer==index = outer(index)
装饰器修复技术
from functools import wraps
def outer(func):
@wraps(func) # 修复技术就是为了让被装饰对象更加不容易被察觉装饰了
def inner(*args, **kwargs):
print('执行函数之前可以添加的额外功能')
res = func(*args, **kwargs) # 执行被装饰的函数
print('执行函数之后可以添加的额外功能')
return res # 将被装饰函数执行之后的返回值返回
return inner
@outer # index = outer(index)
def index():
print('from index')
print(index)
help(index)
def home():
"""这是一个home函数"""
print('from home')
# help(index)
# help(home)
# print(index)
# help(len)