时间类,如何适当地添加两个时间类

时间:2017-01-28 23:20:37

标签: python

class Time(object):

    def __init__(self,hour=0, minute= 0, second=0):
        if type(hour) != int or type(minute) != int or type(second) != int or hour < 0 or hour > 23 or minute < 0 or minute > 59 or second < 0 or second > 59:
            raise AssertionError
        self.hour = hour
        self.minute = minute 
        self.second = second

    def __add__(self,right):
        d = 0
        m = 0
        if type(right) != Time and type(right)!= int:
            raise TypeError
        if type(right) == int:
            self.second += right 
            if self.second > 59:
                d = self.second // 60
                m = self.second % 60 
                self.minute += d 
                self.second = m 
                if self.minute > 59:
                    d = self.second // 60
                    m = self.second % 60
                    self.hour += d 
                    self.minute = m
                    if self.hour > 23:
                        self.hour -= 12
        elif type(right) == Time:
            self.second = self.second + right.second
            if self.second > 59:
                d = self.second // 60
                m = self.second % 60
                self.minute += d 
                self.second = m 
                if self.minute > 59:
                    d = self.second // 60
                    m = self.second % 60
                    self.hour += d 
                    self.minute = m
                    if self.hour > 23:
                        self.hour -= 12
            self.minute = self.minute + right.minute 
            if self.minute > 59:
                d = self.minute // 60
                m = self.second % 60
                self.hour = self.hour + d 
                self.minute = m 
                if self.hour > 23:
                    self.hour -= 12 
        return self

我正在编写+运算符以允许添加Time对象和int,从而产生新的Time对象。 right可以是时间对象,也可以是整数。如果是整数,则应将其视为秒。应允许Time + intint + Time,并且具有相同的含义。

正如你所看到的,我的代码有点乱。而且,它没有产生正确的结果。看错误如下:

*Error: t+70 -> 12:01:11am but should -> 12:01:10am
*Error: t+3600 -> 12:11:11am but should -> 1:00:00am
*Error: t+86400 -> 12:11:11am but should -> 12:00:00am
*Error: t -> 12:11:11am but should -> 12:00:00am
*Error: Time(4,56,23)+500 -> 4:43:43am but should -> 5:04:43am
*Error: Time(23,58,6)+736 -> 11:22:22pm but should -> 12:10:22am
*Error: 1+t raised exception TypeError: unsupported operand type(s) for +: 'int' and 'Time'
*Error: 70+t raised exception TypeError: unsupported operand type(s) for +: 'int' and 'Time'

有人可以帮我修改我的代码或告诉我一个更好的方法,以便我可以简化我的代码吗?提前致谢。

1 个答案:

答案 0 :(得分:1)

  

或告诉我一个更好的方法

使用datetime。它提供了您所需要的一切:

import datetime

start = datetime.datetime(2000, 1, 1, 12)
for second in [70, 3600, 86400]:
    date = start + datetime.timedelta(seconds=second)
    print(date.time())

输出:

12:01:10
13:00:00
12:00:00

如果您想拥有自己的课程,可以在班级中使用datetime ::

class Time(object):

    def __init__(self, hour=0, minute= 0, second=0):
        self._date = datetime.datetime(2000, 1, 1, hour, minute, second)

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

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

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

    def __add__(self, other):
        time_ = (self._date + datetime.timedelta(seconds=int(other))).time()
        return Time(time_.hour, time_.minute, time_.second)

    def __radd__(self, other):
        return self.__add__(other)

尝试一下:

>>> t = Time(12, 0, 0)
>>> t2 = t + 3600
>>> t2.hour
13
>>> t3 = 3600 + t
>>> t3.hour
13