飞花落尽 发表于 2021-8-10 11:10:44

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

运行代码: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) - int(self.t1))
                #此处有0时59分和1时的问题,相减没有退位的问题
      print("停止计时")
      print("总共运行了{}时{}分{}秒".format(self.t3,self.t3,self.t3))
    def __add__(self,other):
      for i in range(3):
            self.t4.append(self.t3 + other.t3)
      print("总共运行了{}时{}分{}秒".format(self.t4,self.t4,self.t4))
      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秒

多次试验红色部分永远一样,是哪里出问题了?

2012277033 发表于 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) - int(self.t1))
            if self.t3<0:
                self.t3+=60
                self.t2=str(int(self.t2)-1)
            self.t3.insert(0,int(self.t2) - int(self.t1))
            if self.t3<0:
                self.t3+=60
                self.t2=str(int(self.t2)-1)
            self.t3.insert(0,int(self.t2) - int(self.t1))
         
      print("停止计时")
      print("总共运行了{}时{}分{}秒".format(self.t3,self.t3,self.t3))
    def __add__(self,other):
      self.t4.append(self.t3+other.t3)
      self.t4.append(self.t3+other.t3)
      if self.t4>=60:
            self.t4=60-self.t4
            self.t4+1
      self.t4.append(self.t3+other.t3)
      if self.t4>=60:
            self.t4=60-self.t4
            self.t4+1
            if self.t4>=60:
                self.t4=60-self.t4
                self.t4+1
      print("总共运行了{}时{}分{}秒".format(self.t4,self.t4,self.t4))
      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

逃兵 发表于 2021-8-10 11:18:07

运行了一下,报错了

大马强 发表于 2021-8-10 11:51:21

会不会是你stop太快,我这除了显示有点问题,数据没事
https://static01.imgkr.com/temp/11972c0ba05c445fa56e77aee85c44df.jpg
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, self.t1, self.t1)
      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, self.t2, self.t2)
      self._calc()

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

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


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

飞花落尽 发表于 2021-8-10 12:12:47

逃兵 发表于 2021-8-10 11:18
运行了一下,报错了

嗯?我这好像没报错

飞花落尽 发表于 2021-8-10 12:13:18

逃兵 发表于 2021-8-10 11:18
运行了一下,报错了

请问错误类型是什么?

飞花落尽 发表于 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秒

又运行了一次,这次连格式错的都一样{:9_240:}

飞花落尽 发表于 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秒

2012277033 发表于 2021-8-10 12:23:31

还有,关于为什么结果一样的,时因为你的类里面,t1到t4用的都是同一个对象,因为没有self限制,实际上两个实例里面的t1到t4指向的地址都是同一个,所以才会出现你说的一样的问题

大马强 发表于 2021-8-10 12:45:14

飞花落尽 发表于 2021-8-10 12:13
请问错误类型是什么?

这里
self.t3.append(int(self.t2) - int(self.t1))

大马强 发表于 2021-8-10 12:50:31

飞花落尽 发表于 2021-8-10 12:23
t3 = Mytimer()
t3.start()
t.sleep(10)


你stop方法那都没有将三个列表初始化

飞花落尽 发表于 2021-8-10 12:50:42

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

什么意思,t1到t4不是类的属性吗?为什么有self?
不是类的方法才有self吗?

2012277033 发表于 2021-8-10 12:53:00

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

self指向实例本身,self包括属性和方法,每个类都有个__init__方法,可以在这个方法里面初始化实例属性的初始化值

飞花落尽 发表于 2021-8-10 12:53:28

大马强 发表于 2021-8-10 12:45
这里

这里不是只有进退位的问题吗?

2012277033 发表于 2021-8-10 12:54:04

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

你看下我上面回复里面的代码,第一段就是根据你的代码改的,主要是初始化和计算部分做了修改

飞花落尽 发表于 2021-8-10 12:55:20

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

ok,谢谢你的代码,但我还是没明白属性t1到t4为什么要加self

大马强 发表于 2021-8-10 12:55:44

飞花落尽 发表于 2021-8-10 12:53
这里不是只有进退位的问题吗?

你这里直接把列表相加了耶

大马强 发表于 2021-8-10 12:57:22

飞花落尽 发表于 2021-8-10 12:53
这里不是只有进退位的问题吗?

self.t4.append(self.t3 + other.t3)
还有这里,应该是元素相加,你直接拿列表相加了

2012277033 发表于 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

飞花落尽 发表于 2021-8-10 12:58:13

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

哦哦哦,我瞎了,dbq
页: [1] 2
查看完整版本: 能帮我看下为什么我计时器实例化的两个对象输出结果永远相同?