2011-03-26 6 views
0

Класс Часы:
Защиту 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 правильный? Также, как проверить правильность моей функции или нет?

+3

Вы можете проверить, правильна ли ваша функция или нет * пробовать ее *. Это называется тестированием; в этом случае вы даже можете написать [unit test] (http://en.wikipedia.org/wiki/Unit_testing), который бы проверил для вас – Cameron

+1

просто небольшое замечание, ключевое слово «class», используемое в начале должен быть весь строчный («класс»), а не «класс». Это, вероятно, опечатка, но все же, так как кажется, что вы еще не запускали код. – euphoria83

ответ

2

Это выглядит правильно для меня, за исключением двух вещей. Вы можете удалить значения по умолчанию; они кажутся ненужными. Вы хотите установить диапазон значений и поднять ValueError, если они находятся вне пределов досягаемости.

Простым тестом было бы установить часы на что-то, а затем вернуть данные и проверить их; повторите несколько значений. Это может быть автоматизировано; модуль doctest довольно прост в использовании.

EDIT:

Вот пример использования doctest. Тесты идут непосредственно в docstrings в любом месте модуля. 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

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 

геттеры и сеттеры (с.getX() и т. д.) являются непитоновыми; если требуется какой-либо перевод, используйте методы свойств класса (как указано выше), в противном случае обращайтесь к свойствам напрямую (как в Clock.milTime).

Смежные вопросы