fishc098 发表于 2020-7-11 18:04:21

关于小甲鱼第44讲例题

第44讲主要是讲解一个定时器的类,有关魔法方法的问题:
为什么调用t1.stop()方法时没有打印提示语句,不是和小甲鱼老师一样



代码如下:import time as t

class MyTimer:
    def __init__(self):
      self.unit = ['年', '月', '日', '十', '分', '秒']
      self.prompt = '未开始计时!'
      self.lasted = []
      self.st = 0
      self.sp = 0
   
    def __str__(self):
      return self.prompt

    __repr__ = __str__
   
    # 开始计时
    def start(self):
      self.st = t.localtime()
      self.prompt = '提示:请先调用stop()停止计时!'
      print('计时开始...')

    # 停止计时
    def stop(self):
      if not self.st:
            self.prompt = '提示:请先调用start()开始计时!'
      else:
            self.sp = t.localtime()
            self.__calc()
            print('计时结束!')

    # 内部方法,计算运行时间
    def __calc(self):
      self.lasted = []
      self.prompt = '总共运行了'
      for index in range(6):
            self.lasted.append(self.sp - self.st)
            if self.lasted:
                self.prompt += str(self.lasted) + self.unit

      # 为下一轮计时初始化变量
      self.st = 0
      self.sp = 0

冬雪雪冬 发表于 2020-7-11 18:34:33

执行t1.stop(),仅把self.prompt 改为'提示:请先调用start()开始计时!',并没有print
可以这样看一下

Twilight6 发表于 2020-7-11 19:04:31



你先要了解下这 __str__ 和 __repr__ 方法的作用:

__str__方法其实是在print()对象时调用,所以可以自己定义 str 字符串的返回信息,在该方法 return 一个字符串,如果不是字符串则报错

__repr__ 魔法方法:是在控制台直接输出一个对象信息或者print一个对象信息时调用

如果自定了__str__ ,print 时默认执行__str__

如果没有自定 __str__ ,则 print 时执行 __repr__

这里你调用 t1 时候是指 t1 实例对象,所以会自动调用 __repr__ 魔法方法然后返回字符串

而你调用 t1.stop() 是调用 t1 对象的 stop 方法,并不会自动调用 __repr__ 魔法方法,所以不会自己打印


fishc098 发表于 2020-7-11 19:29:58

但是小甲鱼老师演示的时候,调用stop()方法有提示信息{:10_277:}

Twilight6 发表于 2020-7-11 19:44:32

fishc098 发表于 2020-7-11 19:29
但是小甲鱼老师演示的时候,调用stop()方法有提示信息

你没发现 stop 方法里面有明显的 print 吗? 而你的代码没有 print 所以没有打印


zltzlt 发表于 2020-7-11 19:44:35

如果还没有调用 t1.start() 方法开始计时,t1.stop() 方法只会把 self.prompt 修改为 '提示:请先调用start()开始计时!',并不会打印,需要 print(t1) 或者直接输入 t1 才会打印。

zltzlt 发表于 2020-7-11 19:45:11

fishc098 发表于 2020-7-11 19:29
但是小甲鱼老师演示的时候,调用stop()方法有提示信息

你没有完全按着他的代码抄,所以效果不一样

zltzlt 发表于 2020-7-11 19:45:53

fishc098 发表于 2020-7-11 19:29
但是小甲鱼老师演示的时候,调用stop()方法有提示信息

你的这一句和小甲鱼老师不一样

fishc098 发表于 2020-7-11 20:30:17

哦哦,是我疏忽了{:10_269:}
谢谢大家
页: [1]
查看完整版本: 关于小甲鱼第44讲例题