鱼C论坛

 找回密码
 立即注册
查看: 2701|回复: 8

[已解决]初等计时器。。求各位大神指点

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

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

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

x
def stop(self):
        if not self.begin:
            self.prompt = '请先用 start() 开始计时!'

里的    self.prompt = '请先用 start() 开始计时!'为什么在先stop的时候输出不了‘'请先用 start() 开始计时!’呢?而要改成  def stop(self):                                             
                                                                                                                                                                                     if not self.begin:
                                                                                                                                                                                            print( '请先用 start() 开始计时!')
        
明明在 start 方法里就可以输出。。。
求各位大神指点,谢谢!!!
import time as t

class MyTimer():

    def __init__(self):
        self.unit = ['年','月','日','时','分','秒']
        self.prompt = '未开始计时...'
        self.lasted = []
        self.begin = 0
        self.end = 0

    def __str__(self):
        return self.prompt

    __repr__ = __str__


    def __add__(self,other):
        prompt = '总共运行了'
        result = []
        for index in range(6):
            result.append(self.lasted[index] + other.lasted[index])
            if result[index]:
                prompt += (str(result[index] + self.unit[index]))
        return prompt

    
    #开始计时
    def start(self):
        self.begin = t.localtime()     #localtime返回元组(年月日时分秒)对应0-5
                                       #共6个索引值

        self.prompt = '请先用 stop() 停止计时!'
        print('计时开始...')
    
    #停止计时
    def stop(self):
        if not self.begin:
            self.prompt = '请先用 start() 开始计时!'
        else:
            self.end = t.localtime()
            self._calc()
            print('计时结束...')
        

    #内部方法,计算运行时间
    def _calc(self):
        self.lasted = []
        self.prompt = '总共运行了'
        for index in range(6):       #对应前面localtime的元组索引值
            self.lasted.append(self.end[index] - self.begin[index])
            if self.lasted[index]:
                self.prompt += str(self.lasted[index]) + self.unit[index]

         #为下一轮计时初始化变量

        self.begin = 0
        self.end = 0
最佳答案
2020-7-28 13:34:48
本帖最后由 Twilight6 于 2020-7-28 13:36 编辑
JomQ 发表于 2020-7-28 13:10
可是start方法里也没有print呀。。不是靠__str__来输出吗?





print 会自动调用 __str__ 或者 __repr__

而当两个魔法方法存在类中时,__str__ 主要负责 print 时候自动调用,而 __repr__ 主要负责对对象输出的时候自动调用

比如 t = MyTimer() 然后直接调用类对象,>>> t,此时自动调用 __repr__ ,打印__repr__ 设置的返回值,而__repr__ 被赋值为 __str__ 所以此时 t 相当于调用的是 __str__

而 __str__ 是当你 print(t) 此时自动调用

所以直接执行 t 的时候会自动打印的原因是因为自动调用了 __repr__ ,而你调用方法并不会自动调用 __repr__ 所以需要我们自己 print 打印
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-28 13:06:24 | 显示全部楼层
因为 self.prompt = '请先用 start() 开始计时!' 只是给属性赋值,要 print() 才能输出呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-28 13:10:06 | 显示全部楼层
zltzlt 发表于 2020-7-28 13:06
因为 self.prompt = '请先用 start() 开始计时!' 只是给属性赋值,要 print() 才能输出呀

可是start方法里也没有print呀。。不是靠__str__来输出吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-28 13:23:34 | 显示全部楼层
JomQ 发表于 2020-7-28 13:10
可是start方法里也没有print呀。。不是靠__str__来输出吗?

1. start 里面有一句 print('计时开始...')
2. 是靠 __str__ 输出,但要手动调用它
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-28 13:34:48 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-7-28 13:36 编辑
JomQ 发表于 2020-7-28 13:10
可是start方法里也没有print呀。。不是靠__str__来输出吗?





print 会自动调用 __str__ 或者 __repr__

而当两个魔法方法存在类中时,__str__ 主要负责 print 时候自动调用,而 __repr__ 主要负责对对象输出的时候自动调用

比如 t = MyTimer() 然后直接调用类对象,>>> t,此时自动调用 __repr__ ,打印__repr__ 设置的返回值,而__repr__ 被赋值为 __str__ 所以此时 t 相当于调用的是 __str__

而 __str__ 是当你 print(t) 此时自动调用

所以直接执行 t 的时候会自动打印的原因是因为自动调用了 __repr__ ,而你调用方法并不会自动调用 __repr__ 所以需要我们自己 print 打印
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-28 13:49:00 | 显示全部楼层
看不懂- - 1111111
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-28 15:56:02 | 显示全部楼层
zltzlt 发表于 2020-7-28 13:23
1. start 里面有一句 print('计时开始...')
2. 是靠 __str__ 输出,但要手动调用它

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

使用道具 举报

 楼主| 发表于 2020-7-28 15:56:42 | 显示全部楼层
Twilight6 发表于 2020-7-28 13:34
print 会自动调用 __str__ 或者 __repr__

而当两个魔法方法存在类中时,__str__ 主要负责 pr ...

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

使用道具 举报

发表于 2023-9-29 11:15:47 | 显示全部楼层
大神们的回答很好啊,学习了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-24 10:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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