You need to enable JavaScript to run this app. Python自定义时钟类无法输出星期 构造函数属性赋值失效
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.05 13:54:05