2017-05-09 8 views
0

時間が23より大きく、分が60より大きく、秒が60より大きい場合、データを拒否しようとしています(0に変換)それは何もしません。私はget/setメソッドを正しく初期化していないのかどうかは分かりません。時間/分/秒__init__に境界の外にある場合はチェックしませんクラスのデータ(ミューテータ)の検証

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

は、ここに私のコードです。 @brenbarnが言及したよう

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

を、あなたもsetHour、setMinute、およびsetSecondを呼び出すことができます - より良いまだ

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従うこと):あなたの__init__へのアップデート彼らがまた働いていることをテストするために底部のメソッド:

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それらのsetメソッドを呼び出すことを意味するとき、それは '__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を使用している場合:あなたのコードが61秒と分を可能

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;)