七、装饰器

一 、什么是装饰器

  本质就是函数,功能是为其他函数添加新功能

二、 装饰器需要遵循的原则

  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()'''
原文地址:https://www.cnblogs.com/haoy/p/10308715.html