python中的一个简单时钟类

时间:2011-03-26 03:55:25

标签: python

班级时钟:
        def init (个体经营):             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 个答案:

答案 0 :(得分:4)

您可以在类构造函数中初始化时间:

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


clk = Clock(12, 34, 2)

答案 1 :(得分:2)

除了两件事,它对我来说是正确的。您可能想要删除默认值;他们似乎没必要。您希望范围检查值并在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()

答案 2 :(得分:1)

您的setTime方法是正确的,但是将默认小时,分钟和秒设置为此类任意数字似乎很奇怪。也许小时= 12,分钟= 0,秒= 0会更有意义吗?也许最好完全取消默认值。

您没有任何验证 - 如果有人使用您的课程并且意外地将小时数设置为29?

最后,正如我在评论中提到的,您可以通过尝试来测试您的功能。在简单的情况下它做对了吗?它是否使用默认值做正确的事情?如果你在负秒内投掷会发生什么?你想要发生什么?这些是在测试方法或类时应该考虑的所有事情 - 它是否适用于预期的情况,并且它适用于所有异常/极端情况。

对于您的示例,您可以使用asserts编写一个简单的单元测试:

def testSetTime():
    clock = Clock()
    clock.setTime(2, 18, 36)
    assert clock.getHours() == 2
    assert clock.getMinutes() == 18
    assert clock.getSeconds() == 36

然后您可以根据需要添加更多测试(请注意,每个单元测试应该只测试一件事。)

答案 3 :(得分: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

Getters和setter(c.getX()等)是非Pythonic;如果需要某些转换,请使用类属性方法(如上所述),否则直接访问属性(与Clock.milTime一样)。