小甲鱼的铁粉 发表于 2020-6-26 12:20:35

python45课魔法方法计算时间

我自己写了一个代码,但是很短,相比于课后作业的答案少了很多东西,而课后作业里面的一些东西我看不懂,所以来问一下鱼油们
先发一下我自己的代码,自己试过没有错误,只实现了求时间,没有加法
import time as t
class Time():
    def __init__(self):
      print("未开始计时")
      self.begin = 0
      self.end = 0
      self.temp = 0
    def start(self):
      self.begin = t.perf_counter()
      print("计时开始")
    def stop(self):
      self.end = t.perf_counter()
      print("计时结束")
    def result(self):
      self.temp = self.end - self.begin
      self.prompt = "运行了%.2f秒" % self.temp
      self.begin = 0
      self.stop = 0
      print(self.prompt)
接下来是课后作业的答案代码,里面有一些不懂的地方,我把它发评论区,麻烦鱼油们解答一下呗{:10_297:}

import time as t

class MyTimer:
    def __init__(self):
      self.prompt = "未开始计时!"
      self.lasted = 0.0
      self.begin = 0
      self.end = 0
      self.default_timer = t.perf_counter
   
    def __str__(self):
      return self.prompt

    __repr__ = __str__

    def __add__(self, other):
      result = self.lasted + other.lasted
      prompt = "总共运行了 %0.2f 秒" % result
      return prompt
   
    # 开始计时
    def start(self):
      self.begin = self.default_timer()
      self.prompt = "提示:请先调用 stop() 停止计时!"
      print("计时开始...")

    # 停止计时
    def stop(self):
      if not self.begin:
            print("提示:请先调用 start() 进行计时!")
      else:
            self.end = self.default_timer()
            self._calc()
            print("计时结束!")

    # 内部方法,计算运行时间
    def _calc(self):
      self.lasted = self.end - self.begin
      self.prompt = "总共运行了 %0.2f 秒" % self.lasted
      
      # 为下一轮计时初始化变量
      self.begin = 0
      self.end = 0

    # 设置计时器(time.perf_counter() 或 time.process_time())
    def set_timer(self, timer):
      if timer == 'process_time':
            self.default_timer = t.process_time
      elif timer == 'perf_counter':
            self.default_timer = t.perf_counter
      else:
            print("输入无效,请输入 perf_counter 或 process_time")

小甲鱼的铁粉 发表于 2020-6-26 12:23:25

第11行到第14行
    def __str__(self):
      return self.prompt

    __repr__ = __str__
写这些的目的是什么呢?


引用t.perf_counter是,它返回的是数字吗?
我看这里第38行是直接相减了
self.lasted = self.end - self.begin

小甲鱼的铁粉 发表于 2020-6-26 12:25:58

答案中的所有的输入提示和输出好像都是用self.prompt进行的

小甲鱼的铁粉 发表于 2020-6-26 12:27:40

这个def __str__(self):
      return self.prompt

    __repr__ = __str__
唉,真的是迷死我了,不知道他是干嘛的

Twilight6 发表于 2020-6-26 12:36:06

小甲鱼的铁粉 发表于 2020-6-26 12:27
这个def __str__(self):
      return self.prompt




当你对这个类使用 print 时候就会自动调用 __str__ 了

若 __repr__ 和 __str__ 同时存在的时候即 __repr__ = __str__

在IDLE 或者其他编译器 Python 控制台下实例化对象后,对该对象回车的时候回自动调用.

Twilight6 发表于 2020-6-26 12:40:15

小甲鱼的铁粉 发表于 2020-6-26 12:25
答案中的所有的输入提示和输出好像都是用self.prompt进行的



引用t.perf_counter是,它返回的是数字吗?
我看这里第38行是直接相减了

t.perf_counter 是一个 time 模块的函数,加上括号之后代表调用函数

答案中的所有的输入提示和输出好像都是用self.prompt进行的

这里直接用一个变量来进行改变提示语,因为每个方法都有对 self.prompt 的重新赋值,也就是调用了哪个方法 提示语就变成了那个方法的赋值的字符串

小甲鱼的铁粉 发表于 2020-6-26 12:40:40

Twilight6 发表于 2020-6-26 12:36
当你对这个类使用 print 时候就会自动调用 __str__ 了

若 __repr__ 和 __str__ 同时存在的时候即 _ ...

那我不写这个可以吗?按我自己的代码那样{:10_297:}

小甲鱼的铁粉 发表于 2020-6-26 12:42:14

Twilight6 发表于 2020-6-26 12:40
t.perf_counter 是一个 time 模块的函数,加上括号之后代表调用函数




懂了{:10_275:}

Twilight6 发表于 2020-6-26 12:42:34

小甲鱼的铁粉 发表于 2020-6-26 12:40
那我不写这个可以吗?按我自己的代码那样

可以的 只是你需要调用 result 方法 而甲鱼哥只要直接输入实例对象就可以查看了,他的比较方便嘿嘿

小甲鱼的铁粉 发表于 2020-6-26 12:43:26

Twilight6 发表于 2020-6-26 12:42
可以的 只是你需要调用 result 方法 而甲鱼哥只要直接输入实例对象就可以查看了,他的比较方便嘿嘿

嗯{:10_275:}
页: [1]
查看完整版本: python45课魔法方法计算时间