JomQ 发表于 2020-7-28 13:00:23

初等计时器。。求各位大神指点

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 + other.lasted)
            if result:
                prompt += (str(result + self.unit))
      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 - self.begin)
            if self.lasted:
                self.prompt += str(self.lasted) + self.unit

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

      self.begin = 0
      self.end = 0

zltzlt 发表于 2020-7-28 13:06:24

因为 self.prompt = '请先用 start() 开始计时!' 只是给属性赋值,要 print() 才能输出呀

JomQ 发表于 2020-7-28 13:10:06

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

可是start方法里也没有print呀。。不是靠__str__来输出吗?

zltzlt 发表于 2020-7-28 13:23:34

JomQ 发表于 2020-7-28 13:10
可是start方法里也没有print呀。。不是靠__str__来输出吗?

1. start 里面有一句 print('计时开始...')
2. 是靠 __str__ 输出,但要手动调用它

Twilight6 发表于 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 打印

粉红裤衩子 发表于 2020-7-28 13:49:00

看不懂- - 1111111

JomQ 发表于 2020-7-28 15:56:02

zltzlt 发表于 2020-7-28 13:23
1. start 里面有一句 print('计时开始...')
2. 是靠 __str__ 输出,但要手动调用它

谢谢!!我悟了

JomQ 发表于 2020-7-28 15:56:42

Twilight6 发表于 2020-7-28 13:34
print 会自动调用 __str__ 或者 __repr__

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

谢谢!!我悟了

AlbertLiu66 发表于 2023-9-29 11:15:47

大神们的回答很好啊,学习了
页: [1]
查看完整版本: 初等计时器。。求各位大神指点