能帮我看下为什么我计时器实例化的两个对象输出结果永远相同?
运行代码:import time as tclass 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 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 运行了一下,报错了 会不会是你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 11:18
运行了一下,报错了
嗯?我这好像没报错 逃兵 发表于 2021-8-10 11:18
运行了一下,报错了
请问错误类型是什么? 大马强 发表于 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 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秒 还有,关于为什么结果一样的,时因为你的类里面,t1到t4用的都是同一个对象,因为没有self限制,实际上两个实例里面的t1到t4指向的地址都是同一个,所以才会出现你说的一样的问题 飞花落尽 发表于 2021-8-10 12:13
请问错误类型是什么?
这里
self.t3.append(int(self.t2) - int(self.t1)) 飞花落尽 发表于 2021-8-10 12:23
t3 = Mytimer()
t3.start()
t.sleep(10)
你stop方法那都没有将三个列表初始化 2012277033 发表于 2021-8-10 12:23
还有,关于为什么结果一样的,时因为你的类里面,t1到t4用的都是同一个对象,因为没有self限制,实际上两个 ...
什么意思,t1到t4不是类的属性吗?为什么有self?
不是类的方法才有self吗? 飞花落尽 发表于 2021-8-10 12:50
什么意思,t1到t4不是类的属性吗?为什么有self?
不是类的方法才有self吗?
self指向实例本身,self包括属性和方法,每个类都有个__init__方法,可以在这个方法里面初始化实例属性的初始化值 大马强 发表于 2021-8-10 12:45
这里
这里不是只有进退位的问题吗? 飞花落尽 发表于 2021-8-10 12:50
什么意思,t1到t4不是类的属性吗?为什么有self?
不是类的方法才有self吗?
你看下我上面回复里面的代码,第一段就是根据你的代码改的,主要是初始化和计算部分做了修改 2012277033 发表于 2021-8-10 12:19
你这个代码问题太多了,大致猜测你应该将time重命名为t了,按照你的思路,大概改了下:
不过,其实实现计时 ...
ok,谢谢你的代码,但我还是没明白属性t1到t4为什么要加self 飞花落尽 发表于 2021-8-10 12:53
这里不是只有进退位的问题吗?
你这里直接把列表相加了耶 飞花落尽 发表于 2021-8-10 12:53
这里不是只有进退位的问题吗?
self.t4.append(self.t3 + other.t3)
还有这里,应该是元素相加,你直接拿列表相加了 本帖最后由 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 2012277033 发表于 2021-8-10 12:54
你看下我上面回复里面的代码,第一段就是根据你的代码改的,主要是初始化和计算部分做了修改
哦哦哦,我瞎了,dbq
页:
[1]
2