2011-03-26 59 views
0

类时钟:
DEF 初始化(个体): self._hours = 12个 self._minutes = 0 self._seconds = 0一个简单的时钟类在python

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方法是否正确?另外,如何检查我的功能是否正确?

+3

您可以通过*尝试*来检查您的功能是否正确。这叫做测试;在这种情况下,你甚至可以编写一个[单元测试](http://en.wikipedia.org/wiki/Unit_testing),它会为你测试 – Cameron 2011-03-26 03:59:50

+1

只是一个小小的评论,一开始使用的“class”关键字应该全部为小写(“班级”),而不是“班级”。这可能是一个错字,但仍然是,因为它似乎还没有运行代码。 – euphoria83 2011-03-26 04:19:56

回答

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() 
+0

你能否提供一个模块来编写测试函数,因为我不知道如何创建一个测试函数? – hkus10 2011-03-26 04:05:02

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 

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

4

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

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


clk = Clock(12, 34, 2) 
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 

getter和setter方法(C。getX()等)是非pythonic;如果需要一些翻译,请使用类属性方法(如上所述),否则直接访问属性(与Clock.milTime一样)。