zoukankan      html  css  js  c++  java
  • 七、装饰器

    一 、什么是装饰器

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

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

      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()'''
  • 相关阅读:
    【JAVA】日志管理slf4j
    【JAVA】从java线程来看java内存模型
    【数据结构】---栈和队列
    【数据结构】---链表
    C++ 第10章 反省程序与C++标准模板库
    回忆C++知识点(1)
    C++ 第8章 多态性
    C++ 第7章 继承与派生
    C++ 第6章 数组、指针、字符串
    C++ 第5章 数据的共享与保护
  • 原文地址:https://www.cnblogs.com/haoy/p/10308715.html
Copyright © 2011-2022 走看看