装饰器Python】进阶知识点

要明白装饰器首先得知道闭包 

闭包:是内部函数对外部函数作用域的引用,并且一般外部函数函数的返回值是内部函数的函数名

               def outer(x):    # 外部函数
                      a = x * 2
                         def inter(b)  # 内部函数
                              return a + b   # inter 函数内部使用了outer函数内部的变量
                    return inter
              outer(1,2)

-装饰器:  @
      - 装饰器又叫语法糖,装饰器是一个闭包函数,装饰器的作用不会修改原有函数的功能,在原有的基础上添加自己的新的功能。 

def outer(func):    #3、  #  接受的这个参数 func  ==  operated函数名
    def inter():   # 5、
        b = 2      #6、
        result = func(b)   # 6、  # func(b)  == operated(b)
        return result    # 9、    # return operated(b)   ==  operated(b)函数的调用
    return inter    # 4、
    # return inter  # 返回函数名或者函数对象
    # return inter() # 返回函数调用


@outer   # 2、装饰器
def operated(b):  # 7、
    c = 1         # 8、
    a = b + c     # 8、
    print(a)      #8、
operated()  # 1、

执行流程 : 1、如果你用到了装饰器 ,装饰器会把被装饰的函数名当作参数接受上来,并且再执行调用一次
        如果你调用 operated()  --> 首先会执行  @outer ,  @outer == outer(operated)()
     2、执行完outer(operated)返回了一个outer() 函数的内部函数名 ,inter,执行完outer(operated)() 是不是返回了inter(),效果是调用了内部函数inter()
     3、当执行 inter()[这是一个函数调用] 会执行inter()函数中的内容
                              b = 2
                              result = func(b)    #
      当执行到  result = func(b) 时,又是一个函数调用 ,调用了func(b),我们知道func 是被装饰函数传递过来的参数,operated
      func(b) == operated(b) 回调了,被装饰函数operated(),并且传入了参数b,并且将调用的结果

返回赋值给了resullt变量,
      最后一步返回变量 resullt 也就是返回了  operated(b) 函数执行的结果
 

疑惑点:

 执行   @outer  等于执行    outer(operated)()  ,执行完outer(operated)()  返回了return inter(),明明 operated并没有被传递,为什么inter()函数却可以调用 

猜你喜欢

转载自blog.csdn.net/weixin_59131972/article/details/131031167