Python——装饰器(无参)

发布时间:2019-08-31 09:41:21编辑:auto阅读(1778)

    装饰器

    装饰器可以叠加使用,执行是从下到上执行的

    无参装饰器 @logger

    1.它是一个语法糖

    2.函数作为它 的形参

    3.返回值也是一个函数

    4.可以使用 @function 方式,简化调用

    注意: 此处的装饰器的定义并不准确,只是方便理解

    装饰器和高阶函数

    装饰器是高阶函数,但装饰器是对传入函数功能的装饰

    装饰器函数的演化过程:

    """

    装饰器

    一个普通的加法函数,想增强他的功能

    """

    def add(x,y):

       return x + y

    """增加信息输出功能"""

    def add(x,y):

       print("call add,x+y")# 日志输出到控制台

       return x + y

    """上面的函数是完成了需求,但是有缺点

    1.print语句的耦合度太高

    2.加法函数属于业务功能,而输出信息的功能,属于非业务功能代码,不该放在业务函数加法中"""

    """把添加功能移出来"""

    def logger(fn):

       print("call add,x+y")

       ret = fn(3,4)

       return ret

    print(logger(add))

    def logger(fn,x,y):

       print("call add,x+y")

       ret = fn(x,y)

       return ret

    print(logger(add,3,4))

    def logger(fn,*args,**arges):

       print("call add,x+y")

       ret = fn(*args,**arges)

       return ret

    print(logger(add,3,4))

    def logger(fn):

       def wrapper(*args,**arges): # 可变位置传参,可变关键字传参

           print("call add,x+y")

           ret = fn(*args,**arges) # 参数解构

           return ret

       return wrapper

    print(logger(add)(4,5))

    add = logger(add) # add = wrapper

    ret = add(4,5) # wrapper(4,5)

    装饰器 核心思想

    import datetime

    def logger(fn):

       def wrapper(*args,**arges): # 可变位置传参,可变关键字传参

           print("前面增强")

           start = datetime.datetime.now()

           ret = fn(*args,**arges) # 参数解构

           delta = (datetime.datetime.now() - start).total_seconds()

           print("so fast") if delta < 5 else print("so slow")

           print("后面增强")

           return ret

       return wrapper

    @logger # add = logger(add) => add 就是 wrapper

    def add(x,y): # wrapper(4,5)

       return x + y

    ret = add(4,5) # wrapper(4,5) => logger(add)(4,5)

    print(ret)

    理解装饰器:

    1.装饰器函数

    2.前置功能增强

    3.被增强函数

    4.后置功能增强


    def logger(fn):                     # 调用 被装饰的函数

       def wrapper(*args,**kwargs):    # 传入被装饰函数参数

           print("before function")    # 前置功能增强

           ret = fn(*args,**kwargs)    # 使用被装饰函数的功能

           print("after function")     # 后置功能增强

           return ret                  # 返回被装饰函数的 计算结果

       return wrapper                  # 返回 被装饰的函数

    @logger                             # 无参装饰器

    # @logger <==> add = logger(add) = wrapper # add(x,y) == wrapper(x,y)

    def add(x,y):                       # 被装饰的函数

       return x + y

    add(3,4)

    print(add(3,4))

    #看似调用add函数,使用了装饰器@logger之后,实际上 调用的是 wraaper(*args,**kwargs)函数


关键字