2011-03-26 61 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一樣)。