本帖最后由 jackz007 于 2024-1-24 23:57 编辑
first 是一个闭包#first
def outer(func):
def inner():
. . . . . .
return inner # 因为函数 outer() 返回的是 内嵌函数 inner() 的调用句柄。
. . . . . .
f = outer() # 变量 f 接收到内嵌函数的调用句柄
f() # 调用 outer() 的内嵌函数 inner()
second 是一个装饰器#second
def outer(func): # 函数 outer() 用于对函数 say() 进行装饰器包装,以便在 say() 被调用的时候获得控制
def inner(*args,**kwargs): # 当对 say(* args , ** kwargs) 进行调用时,实际上是 outer() 的内嵌函数 inner(* args , ** kwargs) 被调用
print('*' * 50) # 先连续打印 50 个 '*'
return func(*args,**kwargs) # 再返回对被装饰函数 say(* args , ** kwargs) 的调用结果
return inner
@outer # 声明函数 say() 被 outer() 函数装饰,此后,凡是对 say() 函数的调用都转向到对 outer()
# 的内嵌函数 inner() 的调用,并在 inner() 中完成对被装饰函数 say() 的调用
def say(name,age):
print('my name is %s, I am %d years old ' % (name,age))
return 'aaaa'
# say('sunck',19)
l = say('sunck',19) # 实际调用的是 inner('sunck' , 19)
# 先执行 print('*' * 50)
# 再返回对函数 say('sunck' , 19) 的调用结果
二者是完全不同的两个概念,所以,二者的运行结果毫无可比性,这是正常的结果。 |