2017-05-09 58 views
0

如果例如小時大於23,分鐘大於60,第二大於60,我試圖拒絕數據(轉換爲0),但是我遇到問題它什麼都不做。我不確定我是不是正確地初始化我的get/set方法,或者是什麼。在類中驗證數據(增變器)

這裏是我的代碼:

class Clock(object): 

    def __init__(self, hour, minute, second): 
     self.__hour = hour 
     self.__minute = minute 
     self.__second = second 

    def setHour(self, hour): 
     self.__hour = hour 
     if self.__hour > 23: 
      self.__hour = 0 

    def getHour(self): 
     return self.__hour 

    def setMinute(self, minute): 
     self.__minute = minute 
     if self.__minute > 60: 
      self.__minute = 0 

    def getMinute(self): 
     return self.__minute 

    def setSecond(self, second): 
     self.__second = second 
     if self.__second > 60: 
      self.__second = 0 

    def getSecond(self): 
     return self.__second 

    def __str__(self): 
     if self.__hour > 11: 
      return 'The Time is {}:{}:{} PM'.format(self.__hour, self.__minute, self.__second) 
     else: 
      return 'The Time is {}:{}:{} AM'.format(self.__hour, self.__minute, self.__second) 


stopwatch = Clock(0, 0, 0) 
print(stopwatch) 
watch = Clock(10, 30, 0) 
print(watch) 
wallclock = Clock(5, 66, 42) 
print(wallclock) 
+1

您的代碼從來沒有調用任何你的方法。 – BrenBarn

回答

1

你不檢查時/分/秒,出界的__init__。更新您的__init__到:

def __init__(self, hour, minute, second): 
    self.__hour = hour 
    if self.__hour > 23: 
     self.__hour = 0 

    self.__minute = minute 
    if self.__minute > 60: 
     self.__minute = 0 

    self.__second = second 
    if self.__second > 60: 
     self.__second = 0 

或更好,但(遵循DRY - 不要重複自己):

def __init__(self, hour, minute, second): 
    self.setHour(hour) 
    self.setMinute(minute) 
    self.setSecond(second) 

由於@brenbarn提到,你也可以撥打setHour,setMinute和setSecond方法在底部測試他們也工作:

stopwatch = Clock(0, 0, 0) 
stopwatch.setHour(30) 
print(stopwatch) 
watch = Clock(10, 30, 0) 
watch.setMinute(69) 
print(watch) 
wallclock = Clock(5, 66, 42) 
wallclock.setSecond(70) 
print(wallclock) 
+0

已更新,謝謝! –

+0

@NickWeseman當你指的是調用這些設置方法時,是否應該在__str__方法中? – Nite

+1

不,只有在您創建秒錶,掛鐘和掛鐘時纔會在最下方。添加到我的答案的底部澄清。 –

0

是的,你沒有在你的init函數中調用你的方法。
我有另一種方式來實現你的思想,只需添加一個__setattr__功能,在您的類:

def __setattr__(self, name, value): 
    if name in ['__minute', '__second'] and value > 60: 
     return None 
    if name in ['__hour'] and value > 23: 
     return None 
    super().__setattr__(name, value) 

此功能將檢查值是否正確,值轉換爲0,如果值超出邊界這是一個pythonic函數。

0

如果您正在使用Python 3好得多的解決方案是使用性能(簡化爲只需幾個小時),例如:

class Clock: 
    def __init__(self, hour, minute, second): 
     self._hour = self._minute = self._second = None 

     # Call the properties to apply validation rules 
     self.hour = hour 
     self.minute = minute 
     self.second = second 

    def __str__(self): 
     return 'The Time is {:02}:{:02}:{:02}'.format(self._hour, self._minute, self.second) 

    @property 
    def hour(self): 
     return self._hour 

    @hour.setter 
    def hour(self, value): 
     self._hour = 0 if value > 23 else value 

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

    @minute.setter 
    def minute(self, value): 
     self._minute = 0 if value > 59 else value 

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

    @second.setter 
    def second(self, value): 
     self._second = 0 if value > 59 else value 

PS你的代碼允許61秒,分鐘)