夏瑾 发表于 2025-4-18 11:18:51

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

#如何给装饰器传递函数
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()

FishC 发表于 2025-4-18 11:21:49


import time

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

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

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

funa()
funb()


错误原因及解决方法:

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

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

3. 完整修正要点:

[*]确保装饰器工厂函数的三层嵌套结构
[*]外层logger接收参数msg
[*]中间层time_master接收被装饰函数func
[*]内层wrapper实现具体包装逻辑


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

开始运行程序
正在调用funa
结束程序运行
耗时:2.00秒

开始运行程序
正在调用funb
结束程序运行
耗时:1.00秒


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 函数学习第6章节,如何给构造函数传递参数,程序报错