KONGYIYAO 发表于 2021-1-21 14:43:02

求问闭包和函数调用问题理解求助。

def log(func):
        def wrapper():
                print("start")
                func()
                print("stop")
        return wrapper #这里为什么是return wrapper,而不是return wrapper()
def eat():
    print("开始吃了")



接着运行代码
eat=log(eat)
eat()
运行后代码显示:
“start”
“开始吃了”
“stop”



小甲鱼的书上关于装饰器的解释的例子。
1、在调用时为什么要eat=log(eat)这里的eat是否等于代码里面的func?
2、代码里面的return wrapper ,调用函数不是应该用return wrapper()么?这里要括号和不要括号的区别是什么?
实际我把这个括号加了再运行,发现调用函数时,只需要eat=log(eat),程序就自动接下来运行了,不需要再加上eat()。不懂这是为什么。



jackz007 发表于 2021-1-21 15:07:06

本帖最后由 jackz007 于 2021-1-21 15:19 编辑

def log(func):
    def wrapper():
      print("start")
      func()
      print("stop")
    return wrapper   # 函数 log() 的返回值是其内嵌函数的调用地址以便在 log() 意外也可以被随意调用
def eat():
    print("开始吃了")

a = log(func)
a()                  # 调用 log() 内嵌函数 wrapper()
log(func)()            # 调用 log() 内嵌函数 wrapper()
      运行一下这个代码,就可以加深理解 Python 关于函数地址赋值的事
i , p = input , print      # i、p 分别取得 Python 内建函数 input() 、print() 的调用地址
p('你好' , i('姓名 : '))    # 使用变量 i、p 完成对 input() 和 print() 的调用
         本例中作为 log() 输入参数的 func 应该是另一个函数的调用地址。

KONGYIYAO 发表于 2021-1-21 19:10:20

jackz007 发表于 2021-1-21 15:07
运行一下这个代码,就可以加深理解 Python 关于函数地址赋值的事

         本例中作为 log()...

   本例中作为 log() 输入参数的 func 应该是另一个函数的调用地址。
就是说func实际上是 def eat()这个函数的调用地址的意思不?

jackz007 发表于 2021-1-21 19:32:19

KONGYIYAO 发表于 2021-1-21 19:10
本例中作为 log() 输入参数的 func 应该是另一个函数的调用地址。
就是说func实际上是 def eat() ...

      我说的是这个
def log(func):
    def wrapper():
. . . . . .
      func()
页: [1]
查看完整版本: 求问闭包和函数调用问题理解求助。