Python_huangjiaw 2022-04-30 15:48 采纳率: 93.3%
浏览 14
已结题

两个装饰器的使用,看看为什么会报错?

问题遇到的现象和发生背景
问题相关代码,请勿粘贴截图
#coding=utf-8

#缓存装饰器
import time


class CacheDecorator():
    __cache={}
    def __init__(self,func):
        self.func=func

    def __call__(self, *args, **kwargs):
        #如果缓存中存在对应的方法名,则直接返回其对应返回值,提升效率
        if self.func.__name__ in CacheDecorator.__cache:
            return CacheDecorator.__cache[self.func.__name__]
        #如果缓存中不存在对应的方法名,则执行并缓存其结果
        else:
            result=self.func(*args,**kwargs)
            CacheDecorator.__cache[self.func.__name__]=result
            return result

#计时装饰器
def cost_time(func):
    def infunc(*args,**kwargs):
        start=time.time()
        result=func(args,**kwargs)
        end=time.time()
        print(f'耗时:{end-start}')
        return result
    return infunc

@cost_time
@CacheDecorator
def cost_long_time():
    '''模拟耗时较长,每次执行返回结果都一样的情况'''
    print("start!")
    time.sleep(3)
    print('end')
    return 999

if __name__ == '__main__':
    r1=cost_long_time()
    r2=cost_long_time()

    print(r1)
    print(r2)

运行结果及报错内容
C:\Users\黄佳文\AppData\Local\Microsoft\WindowsApps\python3.10.exe D:/pythonProject/pythonProject/pythonProject/pythonProject/装饰器/装饰器/05_缓存和计时装饰器练习.py
Traceback (most recent call last):
  File "D:\pythonProject\pythonProject\pythonProject\pythonProject\装饰器\装饰器\05_缓存和计时装饰器练习.py", line 42, in <module>
    r1=cost_long_time()
  File "D:\pythonProject\pythonProject\pythonProject\pythonProject\装饰器\装饰器\05_缓存和计时装饰器练习.py", line 26, in infunc
    result=func(args,**kwargs)
  File "D:\pythonProject\pythonProject\pythonProject\pythonProject\装饰器\装饰器\05_缓存和计时装饰器练习.py", line 18, in __call__
    result=self.func(*args,**kwargs)
TypeError: cost_long_time() takes 0 positional arguments but 1 was given

进程已结束,退出代码1


我的解答思路和尝试过的方法
我想要达到的结果
  • 写回答

2条回答 默认 最新

查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 5月8日
  • 已采纳回答 4月30日
  • 创建了问题 4月30日

悬赏问题

  • ¥20 steam下载游戏占用内存
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行
  • ¥15 一个服务器已经有一个系统了如果用usb再装一个系统,原来的系统会被覆盖掉吗
  • ¥15 使用esm_msa1_t12_100M_UR50S蛋白质语言模型进行零样本预测时,终端显示出了sequence handled的进度条,但是并不出结果就自动终止回到命令提示行了是怎么回事:
  • ¥15 前置放大电路与功率放大电路相连放大倍数出现问题
  • ¥80 部署运行web自动化项目
  • ¥15 腾讯云如何建立同一个项目中物模型之间的联系