鱼C论坛

 找回密码
 立即注册
查看: 1457|回复: 3

[已解决]44讲计时器

[复制链接]
发表于 2020-7-11 23:54:15 | 显示全部楼层 |阅读模式

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

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

x
import time as t
import calendar as c

class CalcTime:

    def __init__(self):
        self.begin_time = []
        self.end_time = []
        self.prompt = '未开始计时!'
        self.unit = ['年', '月', '天', '时', '分', '秒']
        self.long_list = []
        
    def __str__(self):
        return self.prompt

    __repr__ = __str__

    def __add__(self,other):
        prompt = ''
        result = []
        for i in range(6):
            result.append(self.long_list[i] + other.longlist[i])
            prompt += str(result[i]) + self.unit[i]
        return self.prompt

    def start(self):
        self.prompt = '请先调用stop()停止计时!!'
        self.begin_time = t.localtime()
        print('计时开始...')


    def stop(self):
        if not self.begin_time:
            print('请先调用start()开始计时!!')
        else:
            self.end_time = t.localtime()
            self.cal()
            print(self.long_list)
            print('计时结束...')


    def cal(self):
        self.long_str = ''
        self.moth = 0
        self.index = 0
        self.prompt = '总共运行了'
        #得出两个时间点 年月日时分秒 相差的数值(可能为负)依次加入列表中
        for i in range(6):
            self.index = self.end_time[i] - self.begin_time[i]
            self.long_list.append(self.index)

        #若数值为负,处理后得出正确的时间列表
        while True:
            #月
            if self.long_list[1] < 0:
                self.long_list[0] = self.long_list[0] - 1
                self.long_list[1] = 12 + self.long_list[1]
            #日
            if self.long_list[2] < 0:
                self.long_list[1] = self.long_list[1] - 1
                #计算self.end_time当中的月份有多少天
                self.month = (c.monthrange(self.end_time[0],self.end_time[1]))[1]
                self.long_list[2] = self.month + self.long_list[2]
            #时
            if self.long_list[3] < 0:
                self.long_list[2] = self.long_list[2] - 1
                self.long_list[3] = 24 + self.long_list[3]
            #分
            if self.long_list[4] < 0:
                self.long_list[3] = self.long_list[3] - 1
                self.long_list[4] = 60 + self.long_list[4]
            #秒
            if self.long_list[5] < 0:
                self.long_list[4] = self.long_list[4] - 1
                self.long_list[5] = 60 + self.long_list[5]
            break

        for i in range(6):
            self.prompt += str(self.long_list[i]) + self.unit[i]
        #恢复初始和结束时间
        self.begin_time = []
        self.end_time = []


  运行单个正常,但两个对象相加时始终报错(self.result.append(self.long_list[i] + other.longlist[i])
AttributeError: 'CalcTime' object has no attribute 'longlist'),可longlist属性明明就有的啊

求大佬协助!
最佳答案
2020-7-12 00:09:40
本帖最后由 Twilight6 于 2020-7-12 00:11 编辑



第一个错误:
  1. result.append(self.long_list[i] + other.longlist[i])
复制代码
的 longlist 少了个 下划线,改成
  1. result.append(self.long_list[i] + other.long_list[i])
复制代码
即可


第二个错误:__add__ 返回的是实例变量 self.prompt 而不是你 __add__ 里面设置的 prompt ,把 return self.prompt 改成 return prompt 即可

正确参考代码:

  1. import time as t
  2. import calendar as c


  3. class CalcTime:

  4.     def __init__(self):
  5.         self.begin_time = []
  6.         self.end_time = []
  7.         self.prompt = '未开始计时!'
  8.         self.unit = ['年', '月', '天', '时', '分', '秒']
  9.         self.long_list = []

  10.     def __str__(self):
  11.         return self.prompt

  12.     __repr__ = __str__

  13.     def __add__(self, other):
  14.         prompt = ''
  15.         result = []
  16.         for i in range(6):
  17.             result.append(self.long_list[i] + other.long_list[i])
  18.             print(result[i])
  19.             prompt += str(result[i]) + self.unit[i]
  20.         return prompt

  21.     def start(self):
  22.         self.prompt = '请先调用stop()停止计时!!'
  23.         self.begin_time = t.localtime()
  24.         print('计时开始...')

  25.     def stop(self):
  26.         if not self.begin_time:
  27.             print('请先调用start()开始计时!!')
  28.         else:
  29.             self.end_time = t.localtime()
  30.             self.cal()
  31.             print(self.long_list)
  32.             print('计时结束...')

  33.     def cal(self):
  34.         self.long_str = ''
  35.         self.moth = 0
  36.         self.index = 0
  37.         self.prompt = '总共运行了'
  38.         # 得出两个时间点 年月日时分秒 相差的数值(可能为负)依次加入列表中
  39.         for i in range(6):
  40.             self.index = self.end_time[i] - self.begin_time[i]
  41.             self.long_list.append(self.index)

  42.         # 若数值为负,处理后得出正确的时间列表
  43.         while True:
  44.             # 月
  45.             if self.long_list[1] < 0:
  46.                 self.long_list[0] = self.long_list[0] - 1
  47.                 self.long_list[1] = 12 + self.long_list[1]
  48.             # 日
  49.             if self.long_list[2] < 0:
  50.                 self.long_list[1] = self.long_list[1] - 1
  51.                 # 计算self.end_time当中的月份有多少天
  52.                 self.month = (c.monthrange(self.end_time[0], self.end_time[1]))[1]
  53.                 self.long_list[2] = self.month + self.long_list[2]
  54.             # 时
  55.             if self.long_list[3] < 0:
  56.                 self.long_list[2] = self.long_list[2] - 1
  57.                 self.long_list[3] = 24 + self.long_list[3]
  58.             # 分
  59.             if self.long_list[4] < 0:
  60.                 self.long_list[3] = self.long_list[3] - 1
  61.                 self.long_list[4] = 60 + self.long_list[4]
  62.             # 秒
  63.             if self.long_list[5] < 0:
  64.                 self.long_list[4] = self.long_list[4] - 1
  65.                 self.long_list[5] = 60 + self.long_list[5]
  66.             break

  67.         for i in range(6):
  68.             self.prompt += str(self.long_list[i]) + self.unit[i]
  69.         # 恢复初始和结束时间
  70.         self.begin_time = []
  71.         self.end_time = []
复制代码



小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-7-12 00:00:43 | 显示全部楼层
longlist 少了个下划线,应该是 long_list
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-7-12 00:09:40 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-7-12 00:11 编辑



第一个错误:
  1. result.append(self.long_list[i] + other.longlist[i])
复制代码
的 longlist 少了个 下划线,改成
  1. result.append(self.long_list[i] + other.long_list[i])
复制代码
即可


第二个错误:__add__ 返回的是实例变量 self.prompt 而不是你 __add__ 里面设置的 prompt ,把 return self.prompt 改成 return prompt 即可

正确参考代码:

  1. import time as t
  2. import calendar as c


  3. class CalcTime:

  4.     def __init__(self):
  5.         self.begin_time = []
  6.         self.end_time = []
  7.         self.prompt = '未开始计时!'
  8.         self.unit = ['年', '月', '天', '时', '分', '秒']
  9.         self.long_list = []

  10.     def __str__(self):
  11.         return self.prompt

  12.     __repr__ = __str__

  13.     def __add__(self, other):
  14.         prompt = ''
  15.         result = []
  16.         for i in range(6):
  17.             result.append(self.long_list[i] + other.long_list[i])
  18.             print(result[i])
  19.             prompt += str(result[i]) + self.unit[i]
  20.         return prompt

  21.     def start(self):
  22.         self.prompt = '请先调用stop()停止计时!!'
  23.         self.begin_time = t.localtime()
  24.         print('计时开始...')

  25.     def stop(self):
  26.         if not self.begin_time:
  27.             print('请先调用start()开始计时!!')
  28.         else:
  29.             self.end_time = t.localtime()
  30.             self.cal()
  31.             print(self.long_list)
  32.             print('计时结束...')

  33.     def cal(self):
  34.         self.long_str = ''
  35.         self.moth = 0
  36.         self.index = 0
  37.         self.prompt = '总共运行了'
  38.         # 得出两个时间点 年月日时分秒 相差的数值(可能为负)依次加入列表中
  39.         for i in range(6):
  40.             self.index = self.end_time[i] - self.begin_time[i]
  41.             self.long_list.append(self.index)

  42.         # 若数值为负,处理后得出正确的时间列表
  43.         while True:
  44.             # 月
  45.             if self.long_list[1] < 0:
  46.                 self.long_list[0] = self.long_list[0] - 1
  47.                 self.long_list[1] = 12 + self.long_list[1]
  48.             # 日
  49.             if self.long_list[2] < 0:
  50.                 self.long_list[1] = self.long_list[1] - 1
  51.                 # 计算self.end_time当中的月份有多少天
  52.                 self.month = (c.monthrange(self.end_time[0], self.end_time[1]))[1]
  53.                 self.long_list[2] = self.month + self.long_list[2]
  54.             # 时
  55.             if self.long_list[3] < 0:
  56.                 self.long_list[2] = self.long_list[2] - 1
  57.                 self.long_list[3] = 24 + self.long_list[3]
  58.             # 分
  59.             if self.long_list[4] < 0:
  60.                 self.long_list[3] = self.long_list[3] - 1
  61.                 self.long_list[4] = 60 + self.long_list[4]
  62.             # 秒
  63.             if self.long_list[5] < 0:
  64.                 self.long_list[4] = self.long_list[4] - 1
  65.                 self.long_list[5] = 60 + self.long_list[5]
  66.             break

  67.         for i in range(6):
  68.             self.prompt += str(self.long_list[i]) + self.unit[i]
  69.         # 恢复初始和结束时间
  70.         self.begin_time = []
  71.         self.end_time = []
复制代码



小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-12 00:11:48 | 显示全部楼层
在答案出来之前我已经找到了,还是感谢各位大佬!么么哒
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-23 09:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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