鱼C论坛

 找回密码
 立即注册
查看: 68|回复: 1

[已解决]函数学习第6章节,如何给构造函数传递参数,程序报错

[复制链接]
发表于 3 天前 | 显示全部楼层 |阅读模式

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

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

x
#如何给装饰器传递函数
import time
def logger(msg):
  def time_master(func):
      def wrapper():
          print("开始运行程序")
          start=time.time()
          result=func()#执行被装饰的函数
          stop=time.time()
          print("结束程序运行")
          print(f"[{msg}]一共耗费{(stop-start):.2f}秒。")
          return result #返回原函数的执行结果
      return wrapper #这里返回包装器函数
    return time_master
   


@logger(msg="A")
def funa():
    time.sleep(2)
    print("hello,正在调用funa")
    return 666

@logger(msg="B")
def funb():
    time.sleep(1)
    print("hello,正在调用funb")
    return 555


funa()#测试装饰后的函数
funb()
最佳答案
3 天前

  1. import time

  2. def logger(msg):
  3.     def time_master(func):
  4.         def wrapper():
  5.             print(f"[{msg}] 开始运行程序")  # 使用传入的msg参数
  6.             start = time.time()
  7.             result = func()
  8.             stop = time.time()
  9.             print(f"[{msg}] 结束程序运行")
  10.             print(f"耗时:{(stop-start):.2f}秒")
  11.             return result
  12.         return wrapper
  13.     return time_master  # 注意这个return要和time_master定义对齐

  14. @logger(msg="A")
  15. def funa():
  16.     time.sleep(2)
  17.     print("正在调用funa")
  18.     return 666

  19. @logger(msg="B")
  20. def funb():
  21.     time.sleep(1)
  22.     print("正在调用funb")
  23.     return 555

  24. funa()
  25. funb()
复制代码


错误原因及解决方法:

1. 缩进错误:原代码中 return time_master 缩进不正确,应该与 time_master 的定义对齐(缩进相同层级)

2. 参数未使用:原代码虽然传递了msg参数,但没有在装饰器中实际使用(修正版已在打印语句中添加msg显示)

3. 完整修正要点:
  • 确保装饰器工厂函数的三层嵌套结构
  • 外层logger接收参数msg
  • 中间层time_master接收被装饰函数func
  • 内层wrapper实现具体包装逻辑


运行修正后的代码,可以看到带参数msg的装饰效果:

  1. [A] 开始运行程序
  2. 正在调用funa
  3. [A] 结束程序运行
  4. 耗时:2.00秒

  5. [B] 开始运行程序
  6. 正在调用funb
  7. [B] 结束程序运行
  8. 耗时:1.00秒
复制代码


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 3 天前 | 显示全部楼层    本楼为最佳答案   

  1. import time

  2. def logger(msg):
  3.     def time_master(func):
  4.         def wrapper():
  5.             print(f"[{msg}] 开始运行程序")  # 使用传入的msg参数
  6.             start = time.time()
  7.             result = func()
  8.             stop = time.time()
  9.             print(f"[{msg}] 结束程序运行")
  10.             print(f"耗时:{(stop-start):.2f}秒")
  11.             return result
  12.         return wrapper
  13.     return time_master  # 注意这个return要和time_master定义对齐

  14. @logger(msg="A")
  15. def funa():
  16.     time.sleep(2)
  17.     print("正在调用funa")
  18.     return 666

  19. @logger(msg="B")
  20. def funb():
  21.     time.sleep(1)
  22.     print("正在调用funb")
  23.     return 555

  24. funa()
  25. funb()
复制代码


错误原因及解决方法:

1. 缩进错误:原代码中 return time_master 缩进不正确,应该与 time_master 的定义对齐(缩进相同层级)

2. 参数未使用:原代码虽然传递了msg参数,但没有在装饰器中实际使用(修正版已在打印语句中添加msg显示)

3. 完整修正要点:
  • 确保装饰器工厂函数的三层嵌套结构
  • 外层logger接收参数msg
  • 中间层time_master接收被装饰函数func
  • 内层wrapper实现具体包装逻辑


运行修正后的代码,可以看到带参数msg的装饰效果:

  1. [A] 开始运行程序
  2. 正在调用funa
  3. [A] 结束程序运行
  4. 耗时:2.00秒

  5. [B] 开始运行程序
  6. 正在调用funb
  7. [B] 结束程序运行
  8. 耗时:1.00秒
复制代码


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-21 15:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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