15779327169 发表于 2024-4-16 15:10:55

关于修饰符的相关问题

import time

def timeslong(func):
    start = time.time()
    print("It's time starting ! ")
    func()
    print("It's time ending ! ")
    end = time.time()
    return "It's used : %s." % (end - start)

def myfunc():
    print("Hello FishC.")

t = timeslong(myfunc)
print(t)

请问,这个函数中出现的func()是什么意思?
没太理解这段代码的含义,求教

FishC 发表于 2024-4-16 15:11:20

这段代码中的 `func()` 是一个函数调用,它的意思是执行传入 `timeslong` 函数中的参数 `func` 所代表的函数。也就是说,在这个例子中,`func()` 实际上就是执行 `myfunc()` 这个函数。

在这个例子中,`timeslong` 函数接受一个函数作为参数,并在函数开始执行前打印一条消息,然后执行该函数,最后打印另一条消息并返回函数执行所花费的时间。

所以,当你运行这段代码时,它会输出以下内容:
It's time starting !
Hello FishC.
It's time ending !
It's used : 0.00012345.
其中,`0.0012345` 是 `myfunc` 函数执行所花费的时间,具体时间可能因计算机性能和负载而有所不同。

希望这能帮到你!如有疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

15779327169 发表于 2024-4-16 15:22:00

FishC 发表于 2024-4-16 15:11
这段代码中的 `func()` 是一个函数调用,它的意思是执行传入 `timeslong` 函数中的参数 `func` 所代表的函 ...

很好,我理解了func()的含义,但是对于修饰器的下面这段代码:
import time

def timeslong(func):
    def call():
      start = time.time()
      print("It's time starting ! ")
      func()
      print("It's time ending ! ")
      end = time.time()
      return "It's used : %s." % (end - start)
    return call

@timeslong
def myfunc():
    print("Hello FishC.")

print(myfunc())
其中def call():
.....
      return call
这段代码的含义,另外为什么是返回call

FishC 发表于 2024-4-16 15:22:26

15779327169 发表于 2024-04-16 15:22
很好,我理解了func()的含义,但是对于修饰器的下面这 ...

这段代码是一个修饰器的实现。修饰器允许我们在不修改原始函数代码的情况下,为其添加额外的功能。在这个例子中,`timeslong` 函数是一个修饰器,它接受一个函数作为参数,并返回一个新的函数 `call`。

`call` 函数被嵌套在 `timeslong` 函数内部,它实际上就是对传入的函数 `func` 进行了一些额外操作的包装函数。在 `call` 函数内部,首先记录了函数执行开始的时间,然后打印一条消息,接着执行原始函数 `func`,然后再打印另一条消息,最后记录函数执行结束的时间,并返回函数执行所花费的时间。这样,通过调用 `timeslong` 函数并将原始函数作为参数传入,就可以获得一个新的函数,该函数会在执行之前和之后输出一些额外的信息。

修饰器的关键在于,它返回的是嵌套的 `call` 函数。这是因为修饰器本质上是一个高阶函数,它将原始函数作为参数传入,然后以某种方式处理并返回一个新的函数。所以,在最后一行代码中,`@timeslong` 表示将修饰器应用到函数 `myfunc` 上,相当于执行了 `myfunc = timeslong(myfunc)`,这样 `myfunc` 就变成了 `call` 函数的别名。

所以,当你运行这段代码时,它会输出以下内容:
It's time starting !
Hello FishC.
It's time ending !
It's used : 0.00012345.

其中 `0.00012345` 是 `myfunc` 函数执行所花费的时间,具体时间可能因计算机性能和负载而有所不同。

希望这解释清楚了修饰器的用法和返回 `call` 的意义。如有疑问,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 2024-4-16 17:20:17

import time

def timeslong(func):                   # 调用 timeslong() 的时候需要传入一个参数 func
    start = time.time()
    print("It's time starting ! ")
    func()                           # 这个 func 是一个函数的调用句柄,加括号后就是调用函数,假如调用的时候写的是 timeslong(print),那么,这个时候调用的就是 print() 函数                              
    print("It's time ending ! ")
    end = time.time()
    return "It's used : %s." % (end - start)

def myfunc():
    print("Hello FishC.")

t = timeslong(myfunc)                  # 在 timeslong() 中以 func() 的形式所调用的那个函数实际上就是 myfunc()
print(t)

jackz007 发表于 2024-4-16 17:38:39

本帖最后由 jackz007 于 2024-4-16 17:44 编辑

import time

def timeslong(func):
    def call():
      start = time.time()
      print("It's time starting ! ")
      func()                              # 实际调用被装饰函数 myfunc()
      print("It's time ending ! ")
      end = time.time()
      return "It's used : %s." % (end - start)
    return call                           # 返回 timeslong() 内嵌装饰器函数 call() 的调用句柄,以便可以在外部调用。

@timeslong         # timeslong 装饰了 myfunc,当调用 myfunc() 时,Python 首先调用 timeslong(func) 获得 call 的调用句柄(return call),然后,实际调用内嵌函数 call(),在 call() 内,通过语句 func() 完成对被装饰函数 myfunc() 的调用,
def myfunc():
    print("Hello FishC.")

print(myfunc())
      不用装饰器的等效代码:
import time

def timeslong(func):
    def call():
      start = time.time()
      print("It's time starting ! ")
      func()
      print("It's time ending ! ")
      end = time.time()
      return "It's used : %s." % (end - start)
    return call

def myfunc():
    print("Hello FishC.")

print(timeslong(myfunc)())   # timeslong(myfunc) 就是内嵌函数 call 的调用句柄,加括号就是在调用内嵌函数 call()
页: [1]
查看完整版本: 关于修饰符的相关问题