需求目标
- 核心功能:start(开始计时)、stop(停止计时)
- 显示要求:print 对象/直接调用对象 → 显示计时结果
- 提示要求:未启动/已停止时操作 → 温馨提示
- 扩展功能:两个计时器对象可相加,结果为时间总和
- 资源限制:仅使用 time.localtime() 获取时间
核心实现步骤
- 导入模块:import time
- 类初始化(init)
- 定义属性:begin、end(计时起止时间,初始为0)
- lasted(存储时间差值的列表)
- prompt(提示信息,初始为"未开始计时")
- unit(时间单位列表:年、月、日、时、分、秒)
- start 方法
- 判断:若 begin 非0 → 提示"请先调用 stop 停止计时"
- 正常执行:记录 begin = time.localtime(),提示"计时开始"
- stop 方法
- 判断:若 begin 为0 → 提示"请先调用 start 开始计时"
- 正常执行:记录 end = time.localtime(),调用内部计算方法
- 计算后初始化 begin、end 为0,为下一轮计时准备
- 内部计算方法(_calc)
- 遍历前6个时间元素(年到秒),计算 end 与 begin 的差值,存入 lasted
- 拼接提示信息:非零时间值 + 对应单位 → 生成 prompt
显示功能实现(魔法方法)
- 重写 str:返回 self.prompt
- 重写 repr:令 repr = str,实现直接调用对象显示结果
对象相加功能(add)
- 参数:self(自身对象)、other(另一个计时器对象)
- 逻辑:遍历 lasted 列表,对应位置时间值相加
- 拼接新提示信息:"总共运行了 X年X月X日X时X分X秒"
- 返回拼接后的字符串
避坑要点
- 方法名与属性名冲突:避免属性名用 start/stop,否则会覆盖方法
- 初始化属性:所有实例属性需在 init 中定义,防止未定义报错
- 时间差值处理:直接相减会出现负数(如 1月 - 2月 = -1月),需进阶转换
现存不足
- 时间差值未做负数转换(如负月/负时转成合理正数)
- 计时精度仅到秒,可优化提升精度