为什么我在以下代码中使用的相同的Magic方法会生成与预期不同的输出

时间:2018-08-18 16:24:52

标签: python class magic-methods

class Time:
    def __init__(self, hour=0, minute=0, second=0):
        self.hour = hour
        self.minute = minute
        self.second = second

    def __str__(self):
        return "{}:{:02d}:{:02d}".format(self.hour, self.minute, self.second)

    def __add__(self, other_time):

        new_time = Time()
        if (self.second + other_time.second) >= 60:
            self.minute += 1
            new_time.second = (self.second + other_time.second) - 60
        else:
            new_time.second = self.second + other_time.second

        if (self.minute + other_time.minute) >= 60:
            self.hour += 1
            new_time.minute = (self.minute + other_time.minute) - 60
        else:
            new_time.minute = self.minute + other_time.minute

        if (self.hour + other_time.hour) > 24:
            new_time.hour = (self.hour + other_time.hour) - 24
        else:
            new_time.hour = self.hour + other_time.hour

        return new_time

    def __sub__(self, other_time):

        new_time = Time()
        if (self.second + other_time.second) >= 60:
            self.minute += 1
            new_time.second = (self.second + other_time.second) - 60
        else:
            new_time.second = self.second + other_time.second

        if (self.minute + other_time.minute) >= 60:
            self.hour += 1
            new_time.minute = (self.minute + other_time.minute) - 60
        else:
            new_time.minute = self.minute + other_time.minute

        if (self.hour + other_time.hour) > 24:
            new_time.hour = (self.hour + other_time.hour) - 24
        else:
            new_time.hour = self.hour + other_time.hour

        return new_time


def main():
    time1 = Time(1, 20, 10)

    print(time1)

    time2 = Time(24, 41, 30)

    print(time1 + time2)
    print(time1 - time2)


main()

在时间类中,我定义了具有相同功能的方法 add sub (基本上它们是具有不同调用的相同方法)。 当我运行print(time1 + time2),print(time1 -time2)时,我希望得到相同的输出。但是相反,我最终得到以下输出。

Output: 
1:20:10
2:01:40
3:01:40
expected Output:
1:20:10
2:01:40
2:01:40

如果有人可以指出一种相对于其生成的输出来解释上述代码,或者解释当我运行导致生成的输出的上述代码时实际发生的事情,我将感到非常高兴。

2 个答案:

答案 0 :(得分:1)

self.minute += 1self.hour += 1表示您的__add____sub__都将左侧参数修改为+ / -。因此,在评估time1 + time2之后,time1的值将有所不同,因此当您评估time1 - time2时将得到不同的答案。

答案 1 :(得分:0)

我已经尝试过您的代码,并发现以下内容:在说明之后

Time(time1+time2)

运行,现在time1的值为2:20:10,所以当第二种方法完成时,小时数将是(24 + 2)-24而不是(24 + 1)-24