七、装饰器
一 、什么是装饰器
本质就是函数,功能是为其他函数添加新功能
二、 装饰器需要遵循的原则
1.不修改被装饰函数的源代码(开放封闭原则)
2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式
三 、实现装饰器知识储备
装饰器=高阶函数+函数嵌套+闭包
四、 高阶函数
高阶函数定义(满足上述条件任意一个即可):
1.函数接收的参数是一个函数名
2.函数的返回值是一个函数名
五、装饰器编辑
1. 基本框架
def timer(func): def wrapper(): func() return wrapper
2. 加上参数
def timer(func): def wrapper(*args,**kwargs): func(*args,**kwargs) return wrapper
3. 加上功能
import time def timer(func): def wrapper(*args,**kwargs): start_time=time.time() func(*args,**kwargs) stop_time=time.time() print('共用时:',(stop_time-start_time)) return wrapper
4. 加上返回值
import time def timer(func): def wrapper(*args,**kwargs): start_time=time.time() res=func(*args,**kwargs) stop_time=time.time() print('共用时:',(stop_time-start_time)) return res return wrapper
六、练习
1. 购物网站页面,开始显示主界面,可访问home页面、购物车、查看订单,访问这三个页面前,需先登录
user_list=[ {'name':'alex','passwd':'123'}, {'name':'linhaifeng','passwd':'123'}, {'name':'wupeiqi','passwd':'123'}, {'name':'yuanhao','passwd':'123'}, ] tag=False #用户登录标志 def auther(func): def wrapper(): global tag print(func=='main') #####不能直接比对函数名与字符串,此bug待解决 if func=='main': res=func() return res elif func!='main' and not tag: user=input('用户名:') password=input('密码:') for i in range(len(user_list)): if user_list[i]['name']==user and user_list[i]['passwd']==password: tag=True res=func() return res else:break else: res=func() return res return wrapper @auther def main(): print('欢迎访问主界面') @auther def home(): print('home') @auther def shopping_car(): print('购物车') @auther def order(): print('订单') main() '''home() shopping_car() order() main() home()'''