鱼C论坛

 找回密码
 立即注册
查看: 2220|回复: 22

[已解决]能帮我看下为什么我计时器实例化的两个对象输出结果永远相同?

[复制链接]
发表于 2021-8-10 11:10:44 | 显示全部楼层 |阅读模式
10鱼币
运行代码:import time as t
class Mytimer:
    t1 = []
    t2 = []
    t3 = []
    t4 = []
    def start(self):
        self.t1.append(t.strftime("%H",t.localtime()))
        self.t1.append(t.strftime("%M",t.localtime()))
        self.t1.append(t.strftime("%S",t.localtime()))
        print('开始计时……')
    def stop(self):
        self.t2.append(t.strftime("%H",t.localtime()))
        self.t2.append(t.strftime("%M",t.localtime()))
        self.t2.append(t.strftime("%S",t.localtime()))
        self._calc()
    def _calc(self):
        for i in range(3):
            if self.t1 == []:
                print("请先调用start函数")
                break
            else:
                self.t3.append(int(self.t2[i]) - int(self.t1[i]))
                #此处有0时59分和1时的问题,相减没有退位的问题
        print("停止计时")
        print("总共运行了{}时{}分{}秒".format(self.t3[0],self.t3[1],self.t3[2]))
    def __add__(self,other):
        for i in range(3):
            self.t4.append(self.t3[i] + other.t3[i])
        print("总共运行了{}时{}分{}秒".format(self.t4[0],self.t4[1],self.t4[2]))
        self.t1 = []
        self.t2 = []
        self.t3 = []

结果显示:
>>> t3 = Mytimer()
>>> t3.start()
开始计时……
>>> t3.stop()
停止计时
总共运行了0时0分10秒
>>> t4 = Mytimer()
>>> t4.start()
开始计时……
>>> t4.stop()
停止计时
总共运行了0时0分10秒
>>> t3 + t4
总共运行了0时0分20秒

多次试验红色部分永远一样,是哪里出问题了?
最佳答案
2021-8-10 11:10:45
本帖最后由 2012277033 于 2021-8-10 12:21 编辑

你这个代码问题太多了,大致猜测你应该将time重命名为t了,按照你的思路,大概改了下:
import time as t
class Mytimer:
    def __init__(self):
        self.t1 = []
        self.t2 = []
        self.t3 = []
        self.t4 = []
    def start(self):
        self.t1.append(t.strftime("%H",t.localtime()))
        self.t1.append(t.strftime("%M",t.localtime()))
        self.t1.append(t.strftime("%S",t.localtime()))
        print('开始计时……')
    def stop(self):
        self.t2.append(t.strftime("%H",t.localtime()))
        self.t2.append(t.strftime("%M",t.localtime()))
        self.t2.append(t.strftime("%S",t.localtime()))
        self._calc()
    def _calc(self):
        if self.t1 == []:
            print("请先调用start函数")
            return
        else:
            #这里这么计算,是当比如说11:53:57 到11:54:02的时候,产生负数,就要借一
            self.t3.append(int(self.t2[2]) - int(self.t1[2]))
            if self.t3[0]<0:
                self.t3[0]+=60
                self.t2[1]=str(int(self.t2[1])-1)
            self.t3.insert(0,int(self.t2[1]) - int(self.t1[1]))
            if self.t3[0]<0:
                self.t3[0]+=60
                self.t2[0]=str(int(self.t2[0])-1)
            self.t3.insert(0,int(self.t2[0]) - int(self.t1[0]))
           
        print("停止计时")
        print("总共运行了{}时{}分{}秒".format(self.t3[0],self.t3[1],self.t3[2]))
    def __add__(self,other):
        self.t4.append(self.t3[0]+other.t3[0])
        self.t4.append(self.t3[1]+other.t3[1])
        if self.t4[1]>=60:
            self.t4[1]=60-self.t4[1]
            self.t4[0]+1
        self.t4.append(self.t3[2]+other.t3[2])
        if self.t4[2]>=60:
            self.t4[2]=60-self.t4[2]
            self.t4[1]+1
            if self.t4[1]>=60:
                self.t4[1]=60-self.t4[1]
                self.t4[0]+1
        print("总共运行了{}时{}分{}秒".format(self.t4[0],self.t4[1],self.t4[2]))
        self.t1 = []
        self.t2 = []
        self.t3 = []
t3 = Mytimer()
t2 = Mytimer()
t3.start()

t.sleep(2)
t3.stop()
t2.start()
t.sleep(2)
t2.stop()
t2+t3
不过,其实实现计时器可以更简单点:
import time as time
class Mytimer:
    def __init__(self):
        self.starttime=0
        self.count=0
    def start(self):
        self.starttime=int(time.time())
        print('开始计时……')
    def stop(self):
        self.count=int(time.time())-self.starttime
        print("共运行了{}时{}分{}秒".format(self.count//3600,self.count//60%60,self.count%60))

    def __add__(self,other):
        temp = self.count+other.count
        print("共运行了{}时{}分{}秒".format(temp//3600,temp//60%60,temp%60))
        self.starttime=0
        self.count=0
t3 = Mytimer()
t2 = Mytimer()
t3.start()

time.sleep(2)
t3.stop()
t2.start()
time.sleep(2)
t2.stop()
t2+t3

最佳答案

查看完整内容

你这个代码问题太多了,大致猜测你应该将time重命名为t了,按照你的思路,大概改了下: 不过,其实实现计时器可以更简单点:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-10 11:10:45 | 显示全部楼层    本楼为最佳答案   
本帖最后由 2012277033 于 2021-8-10 12:21 编辑

你这个代码问题太多了,大致猜测你应该将time重命名为t了,按照你的思路,大概改了下:
import time as t
class Mytimer:
    def __init__(self):
        self.t1 = []
        self.t2 = []
        self.t3 = []
        self.t4 = []
    def start(self):
        self.t1.append(t.strftime("%H",t.localtime()))
        self.t1.append(t.strftime("%M",t.localtime()))
        self.t1.append(t.strftime("%S",t.localtime()))
        print('开始计时……')
    def stop(self):
        self.t2.append(t.strftime("%H",t.localtime()))
        self.t2.append(t.strftime("%M",t.localtime()))
        self.t2.append(t.strftime("%S",t.localtime()))
        self._calc()
    def _calc(self):
        if self.t1 == []:
            print("请先调用start函数")
            return
        else:
            #这里这么计算,是当比如说11:53:57 到11:54:02的时候,产生负数,就要借一
            self.t3.append(int(self.t2[2]) - int(self.t1[2]))
            if self.t3[0]<0:
                self.t3[0]+=60
                self.t2[1]=str(int(self.t2[1])-1)
            self.t3.insert(0,int(self.t2[1]) - int(self.t1[1]))
            if self.t3[0]<0:
                self.t3[0]+=60
                self.t2[0]=str(int(self.t2[0])-1)
            self.t3.insert(0,int(self.t2[0]) - int(self.t1[0]))
           
        print("停止计时")
        print("总共运行了{}时{}分{}秒".format(self.t3[0],self.t3[1],self.t3[2]))
    def __add__(self,other):
        self.t4.append(self.t3[0]+other.t3[0])
        self.t4.append(self.t3[1]+other.t3[1])
        if self.t4[1]>=60:
            self.t4[1]=60-self.t4[1]
            self.t4[0]+1
        self.t4.append(self.t3[2]+other.t3[2])
        if self.t4[2]>=60:
            self.t4[2]=60-self.t4[2]
            self.t4[1]+1
            if self.t4[1]>=60:
                self.t4[1]=60-self.t4[1]
                self.t4[0]+1
        print("总共运行了{}时{}分{}秒".format(self.t4[0],self.t4[1],self.t4[2]))
        self.t1 = []
        self.t2 = []
        self.t3 = []
t3 = Mytimer()
t2 = Mytimer()
t3.start()

t.sleep(2)
t3.stop()
t2.start()
t.sleep(2)
t2.stop()
t2+t3
不过,其实实现计时器可以更简单点:
import time as time
class Mytimer:
    def __init__(self):
        self.starttime=0
        self.count=0
    def start(self):
        self.starttime=int(time.time())
        print('开始计时……')
    def stop(self):
        self.count=int(time.time())-self.starttime
        print("共运行了{}时{}分{}秒".format(self.count//3600,self.count//60%60,self.count%60))

    def __add__(self,other):
        temp = self.count+other.count
        print("共运行了{}时{}分{}秒".format(temp//3600,temp//60%60,temp%60))
        self.starttime=0
        self.count=0
t3 = Mytimer()
t2 = Mytimer()
t3.start()

time.sleep(2)
t3.stop()
t2.start()
time.sleep(2)
t2.stop()
t2+t3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-10 11:18:07 | 显示全部楼层
运行了一下,报错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-10 11:51:21 | 显示全部楼层
会不会是你stop太快,我这除了显示有点问题,数据没事

                               
登录/注册后可看大图
import time as t


class Mytimer:
    t1 = []
    t2 = []
    t3 = []
    t4 = []

    def start(self):
        self.t1.append(t.strftime("%H", t.localtime()))
        self.t1.append(t.strftime("%M", t.localtime()))
        self.t1.append(t.strftime("%S", t.localtime()))
        # print(self.t1[0], self.t1[1], self.t1[2])
        print('开始计时……')

    def stop(self):
        self.t2.append(t.strftime("%H", t.localtime()))
        self.t2.append(t.strftime("%M", t.localtime()))
        self.t2.append(t.strftime("%S", t.localtime()))
        # print(self.t2[0], self.t2[1], self.t2[2])
        self._calc()

    def _calc(self):
        for i in range(3):
            if self.t1 == []:
                print("请先调用start函数")
                break
            else:
                self.t3.append(int(self.t2[i]) -
                               int(self.t1[i]))   # 你源代码直接拿列表相加
                # 此处有0时59分和1时的问题,相减没有退位的问题
        print("停止计时")
        print("总共运行了{}时{}分{}秒".format(self.t3[0], self.t3[1], self.t3[2]))

    def __add__(self, other):
        for i in range(3):
            self.t4.append(self.t3 + other.t3)
        print("总共运行了{}时{}分{}秒".format(self.t4[0], self.t4[1], self.t4[2]))
        self.t1 = []
        self.t2 = []
        self.t3 = []


t3 = Mytimer()
t3.start()
t.sleep(10)
t3.stop()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-10 12:12:47 | 显示全部楼层
逃兵 发表于 2021-8-10 11:18
运行了一下,报错了

嗯?我这好像没报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-10 12:13:18 | 显示全部楼层
逃兵 发表于 2021-8-10 11:18
运行了一下,报错了

请问错误类型是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-10 12:16:51 | 显示全部楼层
大马强 发表于 2021-8-10 11:51
会不会是你stop太快,我这除了显示有点问题,数据没事

>>> t1 = Mytimer()
>>> t1.start()
开始计时……
>>> t1.stop()
停止计时
总共运行了0时1分-54秒
>>> t2 = Mytimer()
>>> t2.start()
开始计时……
>>> t2.stop()
停止计时
总共运行了0时1分-54秒

又运行了一次,这次连格式错的都一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-10 12:23:20 | 显示全部楼层
大马强 发表于 2021-8-10 11:51
会不会是你stop太快,我这除了显示有点问题,数据没事

t3 = Mytimer()
t3.start()
t.sleep(10)
t3.stop()

t4 = Mytimer()
t4.start()
t.sleep(20)
t4.stop()

这样运行的话,结果两个还是一样:
开始计时……
停止计时
总共运行了0时0分10秒
开始计时……
停止计时
总共运行了0时0分10秒
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-10 12:23:31 | 显示全部楼层
还有,关于为什么结果一样的,时因为你的类里面,t1到t4用的都是同一个对象,因为没有self限制,实际上两个实例里面的t1到t4指向的地址都是同一个,所以才会出现你说的一样的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-10 12:45:14 | 显示全部楼层
飞花落尽 发表于 2021-8-10 12:13
请问错误类型是什么?

这里
self.t3.append(int(self.t2) - int(self.t1))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-10 12:50:31 | 显示全部楼层
飞花落尽 发表于 2021-8-10 12:23
t3 = Mytimer()
t3.start()
t.sleep(10)

你stop方法那都没有将三个列表初始化
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-10 12:50:42 | 显示全部楼层
2012277033 发表于 2021-8-10 12:23
还有,关于为什么结果一样的,时因为你的类里面,t1到t4用的都是同一个对象,因为没有self限制,实际上两个 ...

什么意思,t1到t4不是类的属性吗?为什么有self?
不是类的方法才有self吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-10 12:53:00 | 显示全部楼层
飞花落尽 发表于 2021-8-10 12:50
什么意思,t1到t4不是类的属性吗?为什么有self?
不是类的方法才有self吗?

self指向实例本身,self包括属性和方法,每个类都有个__init__方法,可以在这个方法里面初始化实例属性的初始化值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-10 12:53:28 | 显示全部楼层

这里不是只有进退位的问题吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-10 12:54:04 | 显示全部楼层
飞花落尽 发表于 2021-8-10 12:50
什么意思,t1到t4不是类的属性吗?为什么有self?
不是类的方法才有self吗?

你看下我上面回复里面的代码,第一段就是根据你的代码改的,主要是初始化和计算部分做了修改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-10 12:55:20 | 显示全部楼层
2012277033 发表于 2021-8-10 12:19
你这个代码问题太多了,大致猜测你应该将time重命名为t了,按照你的思路,大概改了下:
不过,其实实现计时 ...

ok,谢谢你的代码,但我还是没明白属性t1到t4为什么要加self
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-10 12:55:44 | 显示全部楼层
飞花落尽 发表于 2021-8-10 12:53
这里不是只有进退位的问题吗?

你这里直接把列表相加了耶
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-10 12:57:22 | 显示全部楼层
飞花落尽 发表于 2021-8-10 12:53
这里不是只有进退位的问题吗?
self.t4.append(self.t3 + other.t3)
还有这里,应该是元素相加,你直接拿列表相加了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-8-10 12:58:03 | 显示全部楼层
本帖最后由 2012277033 于 2021-8-10 13:02 编辑
飞花落尽 发表于 2021-8-10 12:55
ok,谢谢你的代码,但我还是没明白属性t1到t4为什么要加self


如果不加self的话,实际上定义的这个t1到t4算是类的属性,不是实例的属性,你可以不用创建实例,直接用Mytimer.t1就能访问到,而加了self之后,就表示t1到t4是实例的属性,只有实例才能访问到:t3=Mytimer()t3.t1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-10 12:58:13 | 显示全部楼层
2012277033 发表于 2021-8-10 12:54
你看下我上面回复里面的代码,第一段就是根据你的代码改的,主要是初始化和计算部分做了修改

哦哦哦,我瞎了,dbq
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 15:50

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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