• 七、装饰器


    一 、什么是装饰器

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

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

      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()'''
  • 相关阅读:
    Hacker's guide to Neural Networks
    Backbone Collection 源码简谈
    Backbone Model 源码简谈 (版本:1.1.0 基础部分完毕)
    Android系统架构概述
    关于 Android 程序员最近的状况
    调查:周末iPhone用户喜欢出去玩 Android喜欢宅家看电影/看书
    调查:周末iPhone用户喜欢出去玩 Android喜欢宅家看电影/看书
    Android进阶必学retrofit源码解析
    Android进阶必学retrofit源码解析
    移动互联网资料图
  • 原文地址:https://www.cnblogs.com/haoy/p/10308715.html
Copyright © 2020-2023  润新知