鱼C论坛

 找回密码
 立即注册
查看: 80|回复: 5

[已解决]关于修饰符的相关问题

[复制链接]
发表于 2024-4-16 15:10:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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()是什么意思?
没太理解这段代码的含义,求教
最佳答案
2024-4-16 17:20:17
  1. import time

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

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

  11. t = timeslong(myfunc)                  # 在 timeslong() 中以 func() 的形式所调用的那个函数实际上就是 myfunc()
  12. print(t)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-16 15:11:20 | 显示全部楼层
这段代码中的 `func()` 是一个函数调用,它的意思是执行传入 `timeslong` 函数中的参数 `func` 所代表的函数。也就是说,在这个例子中,`func()` 实际上就是执行 `myfunc()` 这个函数。

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

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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-16 17:20:17 | 显示全部楼层    本楼为最佳答案   
  1. import time

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

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

  11. t = timeslong(myfunc)                  # 在 timeslong() 中以 func() 的形式所调用的那个函数实际上就是 myfunc()
  12. print(t)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-4-16 17:38:39 | 显示全部楼层
本帖最后由 jackz007 于 2024-4-16 17:44 编辑
  1. import time

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

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

  14. print(myfunc())
复制代码

        不用装饰器的等效代码:
  1. import time

  2. def timeslong(func):
  3.     def call():
  4.         start = time.time()
  5.         print("It's time starting ! ")
  6.         func()
  7.         print("It's time ending ! ")
  8.         end = time.time()
  9.         return "It's used : %s." % (end - start)
  10.     return call

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

  13. print(timeslong(myfunc)())   # timeslong(myfunc) 就是内嵌函数 call 的调用句柄,加括号就是在调用内嵌函数 call()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 01:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表