要明白装饰器首先得知道闭包
闭包:是内部函数对外部函数作用域的引用,并且一般外部函数函数的返回值是内部函数的函数名
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()函数却可以调用