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()
    

    记录用户的登入日志

    计算这个函数的执行时间

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

  • 相关阅读:
    Node-SASS安装
    小程序码传前端
    Java多线程回调
    eclipse 添加subversion管理svn
    本地git管理多个远端仓库
    oracle 数据库备份expdp、impdp
    清理maven本地库中的lastUpdated文件
    解决tomcat同时部署两个SpringBoot应用提示InstanceAlreadyExistsException
    tomcat 配置本地路径映射
    AndyLizh老师SpringBoot学习
  • 原文地址:https://www.cnblogs.com/394991776zyh/p/14282819.html
Copyright © 2011-2022 走看看