定义实例属性修改提示只读?

问题描述

学习Python仅半个月,写了一个简单的时钟程序,可实现计时或显示本地时间。
在实例化运行时提示:
AttributeError: 'Clock' object attribute 'seconds' is read-only

问题出现的环境背景及自己尝试过哪些方法

版本:3.7
把能试的办法都试过了,检查不出这个bug

相关代码

import time
from copy import deepcopy
from os import system


class Clock(object):
    __slots__ = ('hours', 'minutes', 'seconds', '_years', '_months', '_days')

    def __init__(self, hours=0, minutes=0, seconds=0, years=0, months=0, days=0):
        self.hours = hours
        self.minutes = minutes
        self.seconds = seconds
        self._years = years
        self._months = months
        self._days = days

    @property
    def year(self):
        return self._years

    @property
    def month(self):
        return self._months

    @property
    def day(self):
        return self._days

    @year.setter
    def year(self, years):
        self._years = years

    @month.setter
    def month(self, months):
        self._months = months

    @day.setter
    def day(self, days):
        self._days = days

    @classmethod
    def change(cls):
        # 获取本地时间
        cls._years = time.localtime()[0]
        cls._months = time.localtime()[1]
        cls._days = time.localtime()[2]
        cls.hours = time.localtime()[3]
        cls.minutes = time.localtime()[4]
        cls.seconds = time.localtime()[5]

    def judgement(self):
        # 判断平年闰年
        leap_year = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
        non_leap_year = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
        if not (self._years % 4):
            this_year = deepcopy(leap_year)
        else:
            this_year = deepcopy(non_leap_year)
            return this_year

    def run(self):
        # 时钟
        if self._days == 0 or self._months == 0 or self._days == 0:
            Clock().change()
        while True:
            self.seconds += 1
            if self.seconds == 60:
                self.minutes += 1
                self.seconds = 0
                if self.minutes == 60:
                    self.hours += 1
                    self.minutes = 0
                    if self.hours == 24:
                        self._days += 1
                        self.hours = 0
                        this_year = Clock().judgement()
                        if self._days == this_year[self._months + 1]:
                            self._months += 1
                            self._days = 0
                            if self._months == 12:
                                self._years += 1
                                self._months = 0
            print('%04d.%02d.%02d %02d:%02d:%02d' % (self._years, self._months, self._days,
                                                     self.hours, self.minutes, self.seconds))
            time.sleep(1)
            system('cls')


a = Clock()
a.run()
阅读 1.7k
1 个回答

我试了一下, 如果在设置了__solts__的情况下, 先修改同名类属性, 再修改实例属性 就会报错, 如:

a = Clock()
Clock.seconds = 1
a.seconds = 2

去掉__solts__,或者把你的本地时间存到别的地方去。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题