• 七、装饰器


    一 、什么是装饰器

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

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

      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()'''
  • 相关阅读:
    hdu 4135 Co-prime (容斥定理)
    hdu 1509 Windows Message Queue (优先队列)
    poj 2104 K-th Number (划分树)
    hdu 1556 Color the ball (树状数组)
    海量大数据大屏分析展示一步到位:DataWorks数据服务对接DataV最佳实践
    使用MaxCompute Java SDK运行安全相关命令
    使用MaxCompute Java SDK 执行任务卡住了,怎么办?
    老代码多=过度耦合=if else?阿里巴巴工程师这样捋直老代码
    日志服务Python消费组实战(三):实时跨域监测多日志库数据
    如何限制用户仅通过HTTPS方式访问OSS?
  • 原文地址:https://www.cnblogs.com/haoy/p/10308715.html
Copyright © 2020-2023  润新知