鱼C论坛

 找回密码
 立即注册
查看: 1286|回复: 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 编辑



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


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

正确参考代码:
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.long_list[i])
            print(result[i])
            prompt += str(result[i]) + self.unit[i]
        return 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 = []


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-12 00:00:43 | 显示全部楼层
longlist 少了个下划线,应该是 long_list
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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



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


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

正确参考代码:
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.long_list[i])
            print(result[i])
            prompt += str(result[i]) + self.unit[i]
        return 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 = []


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-12 00:11:48 | 显示全部楼层
在答案出来之前我已经找到了,还是感谢各位大佬!么么哒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 01:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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