zoukankan      html  css  js  c++  java
  • 假期python复习3

    装饰器进阶

    带参数的装饰器

    500个函数

    @wrapper要500遍

    @timmer_out(FLAGE)
    
    def timmer_out(flag):
        def timmer(func):
            def inner(*args, **kwargs):
                if flag:
                    start = time.time()
                    ret = func(*args, **kwargs)
                    end = time.time()
                    print(end - start)
                    return ret
                else:
                    ret = func(*args, **kwargs)
                    return ret
    
            return inner
    
        return timmer
    

    首先是执行函数timmer_out(FLAGE)然后返回timmer

    前面的@加返回的timmer构造语法糖

    过程为timmer_out(FLAG) == timmer

    @timmer == wahaha = timmer(wahaha)

    多了一个参数,多次调用

    可以理解为

    timmer = timmer_out(FLAGE)

    然后@timmer原理一样

    这样可以控制装饰器是否使用并且可以控制多个装饰器

    # 带参数的装饰器
    # 500个函数
    import time
    
    FLAGE = True
    
    def timmer_out(flag):
        def timmer(func):
            def inner(*args, **kwargs):
                if flag:
                    start = time.time()
                    ret = func(*args, **kwargs)
                    end = time.time()
                    print(end - start)
                    return ret
                else:
                    ret = func(*args, **kwargs)
                    return ret
    
            return inner
    
        return timmer
    # FLAGE = False
    
    @timmer_out(FLAGE)
    def wahaha():
        time.sleep(0.1)
        print("wahaha")
    
    
    @timmer_out(FLAGE)
    def erguotou():
        time.sleep(0.5)
        print('erguotou')
    
    
    
    
    wahaha()
    
    erguotou()
    

    一个函数被多个装饰器装饰

    流程:

    先运行第一个装饰器运行到被装饰函数之前的代码

    在运行第二个装饰器运行到被装饰函数之前的代码

    运行被装饰函数

    在运行第二个装饰器运行被装饰函数之后的代码

    在运行第一个装饰器运行被装饰函数之后的代码

    语法糖先执行离函数近的

    所以下面列子先执行wrapper1在执行wrapper2

    # 多个装饰器装饰一个函数
    
    def wrapper1(func):
        def inner1():
            print("wrapper 1     before func------")
            func()  # --->func()
            print('warpper 1     after  func------')
    
        return inner1
    
    
    def wrapper2(func):
        def inner2():
            print("wrapper 2     before func------")
            func()  # innner1()
            print('warpper 2     after  func------')
    
        return inner2
    
    
    @wrapper2  # f = wrapper2(f)  ---> wrapper2(inner1) == inner2
    @wrapper1  # f = wrapper1(f)  = inner1
    def func():
        print('in func')
    
    
    func()  # ---->inner2()
    

    记录用户的登入日志

    计算这个函数的执行时间

    如果这样要先写用户的登入日志装饰器在使用执行时间的装饰器

  • 相关阅读:
    JS中的call_user_func封装
    js中insertAdjacentHTML的玩法
    小tip: DOM appendHTML实现及insertAdjacentHTML
    js获取和设置属性的方法
    安装Yeoman,遇到的问题
    HTML中Select的使用详解
    jQuery Ajax异步处理Json数据详解
    chrome浏览器Uncaught TypeError: object is not a function问题解决
    SpringBoot Web实现文件上传下载功能实例解析
    SpringMVC Web实现文件上传下载功能实例解析
  • 原文地址:https://www.cnblogs.com/394991776zyh/p/14282819.html
Copyright © 2011-2022 走看看