Python自定义时钟类无法输出星期 构造函数属性赋值失效
问题根因
代码有三处核心逻辑错误,导致星期信息无法正常显示、跨天联动失效:
- 错误误用父类初始化方法:
DayCounter.__init__里把传入的星期字符串直接作为CyclicCounter.__init__的周期参数传入,完全不符合CyclicCounter要求的「周期值、初始值」参数结构。 - 错误赋值逻辑:Python类的
__init__构造方法默认返回None,代码里self.day = CyclicCounter.__init__(...)实际把self.day赋值成了None,根本没有存储有效的星期索引值,最终__str__返回的是"None"而非对应的星期名称。 - 级联进位逻辑断裂:原来的时钟实现里,小时计数器是普通的
CyclicCounter,没有设计跨天的进位触发逻辑,就算DayCounter初始化正常,时间走到次日也不会自动更新星期。
具体修正方案
重写DayCounter的正确实现
复用父类已经实现的循环计数、值存储能力,去掉错误的自定义day属性,通过索引映射获取星期文本:
class DayCounter(CyclicCounter): _days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] def __init__(self, day='Sunday'): # 找到传入星期在列表中的索引,作为计数器初始值,周期固定为7天 start_idx = self._days.index(day) CyclicCounter.__init__(self, period=7, start=start_idx) def __str__(self): # 覆盖父类默认的数字补0输出,返回对应星期的文本 return self._days[self.value]
补全DayClock的级联进位逻辑
替换小时计数器为支持级联进位的CascadeCounter,把跨天的进位目标指向星期计数器,同时修正分钟计数器的引用绑定:
class DayClock(Clock): def __init__(self, h=0, m=0, s=0, day='Sunday'): super().__init__(h, m, s) # 先初始化星期计数器实例 self._d = DayCounter(day) # 取出原小时计数器的当前值,替换为带进位能力的级联计数器 old_h_value = self._h.value self._h = CascadeCounter(next=self._d, period=24, start=old_h_value) # 修正分钟计数器的进位目标,指向新的小时计数器实例 self._m.next = self._h def __str__(self): return Clock.__str__(self) + ' ' + str(self._d)
修正后效果
运行代码会正常输出带星期的时间,比如初始的23:59:45 Sunday,每过1秒递增,走到23:59:59后会自动进位到00:00:00 Monday,星期跟随跨天自动更新。
内容的提问来源于stack exchange,提问作者user14587018
相关产品推荐
相关产品推荐

