python中的简单时钟

2024-04-26 00:16:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用python编写一个简单的时钟:

class Clock:
    def __init__(self):
        self._hours = 0
        self._minutes = 0

    def gethours(self):
        return self._hours

    def getminutes(self):
        return self._minutes

    def sethours(self, hours):
        self._hours = hours

    def setminutes(self,minutes):
        if self._minutes > 60:
            self._hours = self._hours + 1
            self._minutes = 1
        else:
            self._minutes = minutes

    def tic(self):
        if self._minutes > 58:
            self._hours = self._hours + 1
            self._minutes = 1
        else:
            self._minutes = self._minutes + 1

    minutes = property(getminutes, setminutes)
    hours = property(gethours, sethours)

但是当我现在想用下面的代码检查它时,我在assert(c.hours == i and c.minutes == j)处得到了一个AssertionError

^{pr2}$

Tags: selfreturnifdefproperty时钟elseclass
1条回答
网友
1楼 · 发布于 2024-04-26 00:16:21

这里有一个固定的重写,使用相同的测试。 setter负责正确设置小时和分钟的值(尽管hours的setter无法正确地添加超过一天的值,但是这很容易根据与分钟相同的模型添加)。在

那么tic()只是添加一分钟的快捷方式。在

注释掉print语句以删除所有小时:分钟。在

注意:我已经将Clock转换为一个“新样式”类对象,它允许使用属性修饰符并使所有内容更具可读性(这对于python3来说不是必需的,但对于让相同的代码也能在python2中工作是必要的)。在

class Clock(object):
    def __init__(self):
        self._hours = 0
        self._minutes = 0

    @property
    def hours(self):
        return self._hours

    @property
    def minutes(self):
        return self._minutes

    @minutes.setter
    def minutes(self, value):
        if value >= 60:
            # Take care, if one adds more than one hour, to
            # take the extra hours into account too:
            self.hours += value // 60
        self._minutes = value % 60

    @hours.setter
    def hours(self, value):
        self._hours = value % 24

    def tic(self):
        self.minutes += 1


c = Clock()

assert(c.minutes == 0 and c.hours == 0)

for i in range(24):
    assert(c.hours == i)
    for j in range(60):
        assert(c.hours == i and c.minutes == j)
        c.tic()
        print('{}:{}'.format(c.hours, c.minutes))

assert(c.minutes == 0 and c.hours == 0)

摘录和输出结尾:

^{pr2}$

相关问题 更多 >