Python中的简单时钟类

0 投票
4 回答
10178 浏览
提问于 2025-04-16 14:27
Class Clock:   
    def __init__(self):
        self._hours = 12
        self._minutes = 0
        self._seconds = 0

    def getHours(self):
        return self._hours

    def getMinutes(self):
        return self._minutes

    def getSeconds(self):
        return self._seconds

    def show(self):
        print "%d:%02d:%02d" % (self._hours, self._minutes, self._seconds)

我想给这个类添加一个叫做setTime的方法,这个方法需要接收小时、分钟和秒作为参数,并对对象的属性进行相应的修改。下面的代码展示了如何使用这个类和setTime方法。

clk = Clock()
clk.setTime(12, 34, 2)
print clk.getHours()
clk.show()

    def setTime(self, hours = 12, minutes = 34, seconds = 2):
        self._hours = hours
        self._minutes = minutes
        self._seconds = seconds

我的问题是,我的setTime方法是否正确?还有,怎么检查我的函数是否正确呢?

4 个回答

1
class Clock(object):
    def __init__(self, hour=12, minute=0, second=0, milTime=False):
        super(Clock,self).__init__()
        self.hour    = hour
        self.minute  = minute
        self.second  = second
        self.milTime = milTime  # 24-hour clock?

    @property
    def hour(self):
        return self._hour if self.milTime else ((self._hour-1) % 12)+1

    @hour.setter
    def hour(self, hour):
        self._hour = hour % 24

    @property
    def minute(self):
        return self._minute

    @minute.setter        
    def minute(self, minute):
        self._minute = minute % 60

    @property
    def second(self):
        return self._second

    @second.setter
    def second(self, second):
        self._second = second % 60

    @property
    def time(self):
        return self.hour, self.minute, self.second

    @time.setter
    def time(self, t):
        self.hour, self.minute, self.second = t

    def __str__(self):
        if self.milTime:
            return "{hr:02}:{min:02}:{sec:02}".format(hr=self.hour, min=self.minute, sec=self.second)
        else:
            ap = ("AM", "PM")[self._hour >= 12]
            return "{hr:>2}:{min:02}:{sec:02} {ap}".format(hr=self.hour, min=self.minute, sec=self.second, ap=ap)

然后

c = Clock(12, 15, 10)
print c                 # -> 12:15:10 PM
c.milTime = True
print c                 # -> 12:15:10
c.hour = 9
print c                 # -> 09:15:10
c.milTime = False
print c                 # -> 9:15:10 AM
c.time = 12,34,2
print c                 # -> 12:34:02 PM

获取器和设置器(比如 c.getX() 之类的)在 Python 中并不是很常见。如果需要进行一些转换,可以使用类的属性方法(像上面那样),否则就直接访问属性(就像 Clock.milTime 那样)。

3

我觉得这个看起来没问题,但有两点需要注意。你可能想去掉默认值,因为它们似乎没什么必要。你还需要检查一下值是否在合理范围内,如果超出了范围,就要抛出一个ValueError错误。

一个简单的测试方法是先把时钟设置成某个值,然后再把数据取回来检查一下;对几个不同的值重复这个过程。这可以自动化,doctest模块使用起来相对简单。

编辑:

这里有一个使用doctest的例子。测试代码可以直接放在模块的文档字符串里。doctest.testmod()会去查找这些测试,并尝试像在交互式会话中那样运行它们。如果输出不符合预期,它会告诉你。如果一切正常,就不会有任何输出。

class Clock:
    """Clock

    Class that acts like a clock.

    For doctest -

    >>> c = Clock()
    >>> c.setTime(23, 59, 59)
    >>> c.show()
    23:59:59
    >>> c.getMinutes()
    59
    >>> c.setTime(0, 0, 0)
    >>> c.show()
    0:00:00

    # No range or type checking yet
    >>> c.setTime(42, 'foo', [1, 2, 3])

    # However, the print will fail
    >>> c.show()
    Traceback (most recent call last):
    ...
    TypeError: int argument required

    # Another kind of error
    >>> c.setTime(foo=42)
    Traceback (most recent call last):
    ...
    TypeError: setTime() got an unexpected keyword argument 'foo'

    """

    def __init__(self):
        self._hours = 12
        self._minutes = 0
        self._seconds = 0

    def getHours(self):
        return self._hours

    def getMinutes(self):
        return self._minutes

    def getSeconds(self):
        return self._seconds

    def show(self):
        print "%d:%02d:%02d" % (self._hours, self._minutes, self._seconds)

    def setTime(self, hours = 12, minutes = 34, seconds = 2):
        self._hours = hours
        self._minutes = minutes
        self._seconds = seconds

if __name__ == '__main__':
    import doctest
    doctest.testmod()
4

你可以在类的构造函数里初始化时间:

Class Clock:   
    def __init__(self, hours, minutes, seconds):
        self._hours = hours
        self._minutes = minutes
        self._seconds = seconds
....


clk = Clock(12, 34, 2)

撰写回答