创建一个Time类
有两种实现方式:
- 用三个参数hours/minutes/seconds
- 用一个seconds创建Time
注意:书上要求的是在内部的参数实现上有两种方式,就是说必须用三个参数创建,但内部可以自由表示;这里我直接用一个seconds
参数表示了,需要的话,改动一下__init__
方法就OK。
方式1:
- 构建Time时,要对参数进行检测,不是很方便。
- 操作时有点麻烦,需要考虑按参数相减后,可能出现负值的情况:
例如hours
位出现负值,就要把hours/minutes/seconds
统统置零;
以此类推,要写出三个if
语句来支持减操作。
方式2:
- 创建需要从
seconds
分割出其他参数,但参数检查方便。 - 对于减操作来说,可以采取用
seconds
参数相减,然后重新构造其他参数,只需要判断一下两数的差是否为负值就可以了。
综合来看,方式2更好一些,下面采取方式2:
class TimeValueError(ValueError):
pass
class Time:
def __init__(seconds):
if isinstance(seconds, int) or isinstance(seconds, str):
self._oldseconds = int(seconds) # 保留原始的seconds参数
self._hours, self._minutes, self._seconds = self.create(self._oldseconds) # 将构建其他参数的过程单独封装
else:
# 让Time类只支持str或者int形式的数字
raise TimeValueError("Time only support `int` or `str`:{}".format(seconds))
def create(self, oldseconds):
s = oldseconds
ParameterList = []
dividendList = [3600, 60, 1] # 将一小时、一分钟等换算成秒
for dividend in dividendList:
quotients, remainders = divmod(s, dividend) # divmod函数是内置函数,返回(商,余数)
ParameterList.append(quotients)
s = remainders
return ParameterList
def SecondRepresentation(self): # 返回时间的秒钟表示
return self._oldseconds
def __str__(self):
return str(self._hours) + ":" + str(self._minutes) + ":" + str(self._seconds)
def __lt__(self, other):
# 比较函数有两种方法,可以比较self._oldseconds
# 也可以比较两者字符串形式大小
return str(self) < str(other)
def __add__(self, other):
self._hours, self._minutes, self._seconds = create(self.SecondRepresentation() + other.SecondRepresentation())
def __sub__(self, other):
self._hours, self._minutes, self._seconds = create(self.SecondRepresentation() - other.SecondRepresentation())
其他简单的方法就略过了,以下是简单的测试:
def testTime():
t1 = Time(85131) # 23:38:51
t2 = Time("83783") # 23:16:23
print("Time1 is : {}".format(str(t1)))
print("Time2 is : {}\n".format(str(t2)))
print("Time1 < Time2 (True or False) : {}".format(t1 < t2))
print("Time1 > Time2 (True or False) : {}\n".format(t1 > t2))
print("Time hours:\n\tTime1:{0}\n\tTime2:{1}\n".format(
t1.hours(), t2.hours()
))
print("Time minutes:\n\tTime1:{0}\n\tTime2:{1}\n".format(
t1.minutes(), t2.minutes()
))
print("Time seconds:\n\tTime1:{0}\n\tTime2:{1}\n".format(
t1.seconds(), t2.seconds()
))
t1 + t2
print("Time1 + Time2 : {}".format(str(t1)))