• 假期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()
    

    记录用户的登入日志

    计算这个函数的执行时间

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

  • 相关阅读:
    解决方法 svn checkout 更改用户名密码/断网续传
    解决方法 cannot be resolved as a type
    解决方法 Syntax error on token "enum", invalid Expression
    使用笔记 Sublime text 持更
    解决方法 cvs或svn上下载的新项目无build path
    解决方法 卸载jdk以及重新安装jdk
    配置笔记 eclipse, jdk, tomcat, maven, mysql, alt+/
    ubantu配置java环境变量
    写给自己的!
    数据设计模式
  • 原文地址:https://www.cnblogs.com/394991776zyh/p/14282819.html
Copyright © 2020-2023  润新知