zoukankan      html  css  js  c++  java
  • 装饰器函数(二)

    装饰器进阶

    1.带参数的装饰器
    就是在原有装饰器的基础上引入一个新的参数

    多套一层函数,多传一个参数决定是否执行添加的功能,只是利用闭包多传了一个参数

    和装饰器的原理一样,这次是把外界要传的参数通过在原有装饰器函数的基础上再套一层函数来实现的

    现在装饰器函数最外层的作用只是在这个嵌套函数结构的空间里引入了一个新的局部变量,且变量的值由外部传入

    此时多了一层函数嵌套,由于每一个函数名加上括号就是一层调用,因此要把@和@后面分开成两部分看,每一个函数名加上括号就是一层调用,因此要把@和@后面分开成两部分看

    import time
    FLAGE = False
    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 = timmer_out(FLAGE)
    @timmer_out(FLAGE)    #wahaha = timmer(wahaha)
    def wahaha():
        time.sleep(0.1)
        print('wahahahahahaha')
    
    @timmer_out(FLAGE)
    def erguotou():
        time.sleep(0.1)
        print('erguotoutoutou')
    
    wahaha()
    erguotou()

    在inner前加装饰器@wraps(func)就不影响原函数名的使用,但是需要从functools模块引入这个函数

    如果是一层装饰器函数,则在外面取运行的函数名不是应有的本名,得到的是装饰器内部的'inner

    2.多个装饰器装饰同一个函数

    上面一个
    下面一个
    先执行上面的前,再下前,再下后,再上后
    套娃执行结构,上面的在最外一圈。
    原理:真实的执行顺序是必须先最近的装饰器函数,最近的装饰器函数把函数名传进来,返回值作为远的装饰器的参数进行执行.

    执行效果如下图

    可以记录用户的登陆情况,又计算执行时间,但是必须两件事执行顺序的逻辑必须明确。

  • 相关阅读:
    LinuxShell脚本攻略--第八章 当个好管家
    LinuxShell脚本攻略--第六章 B计划
    LinuxShell脚本攻略--第三章 以文件之名
    LinuxShell脚本攻略--第二章 命令之乐
    LinuxShell脚本攻略--第一章 小试牛刀
    TCP/IP 与OSI结构图
    网络号和主机号的计算
    IP地址分类及私网IP
    转:Cache相关
    原码 反码 补码 移码
  • 原文地址:https://www.cnblogs.com/shachengcc1/p/11166131.html
Copyright © 2011-2022 走看看