覆盖__add__方法

时间:2019-12-17 21:39:20

标签: python class oop methods

class Clock:


   def __init__(self,hours,minutes):```

   self.hours=hours
   self.minutes=minutes



def Clock(hours,minutes):
        if hours>9 and minutes>9:
            return str(hours)+":"+str(minutes)
        elif hours>9 and minutes<10:
            return str(hours)+":0"+str(minutes)
        elif hours<10 and minutes>9:
            return "0"+str(hours)+":"+str(minutes)
        else:
            return "0"+str(hours)+":"+"0"+str(minutes)

def __add__(self,other):
    ????if Clock.Clock(self.hours,self.minutes)+Clock.Clock(other.hours,other.minutes)????



  t=Clock.Clock(5,6)+Clock.Clock(5,6)
  print(t)  

现在当我打印t时,我将获得05:0605:06 而且我想知道如何覆盖__add__函数,以便在执行Clock.Clock(self,other)+Clock.Clock(self,other)时它将打印出Clock(self,other)+Clock(self,other) 上面的输入等于10:12。

4 个答案:

答案 0 :(得分:2)

您正在添加将串联的字符串,而不是实际添加小时和分钟值。您可能要这样做

def __add__(self,other):
    return Clock.Clock(self.hours+other.hours,self.minutes+other.minutes)

假设小时分钟属性是数字

答案 1 :(得分:1)

In [4]: class Clock:
   ...:
   ...:
   ...:    def __init__(self,hours,minutes):
   ...:        self.hours=hours
   ...:        self.minutes=minutes
   ...:
   ...:    def __repr__(self):
   ...:         if self.hours>9 and self.minutes>9:
   ...:             return str(self.hours)+":"+str(self.minutes)
   ...:         elif self.hours>9 and self.minutes<10:
   ...:             return str(self.hours)+":0"+str(self.minutes)
   ...:         elif self.hours<10 and self.minutes>9:
   ...:             return "0"+str(self.hours)+":"+str(self.minutes)
   ...:         else:
   ...:             return "0"+str(self.hours)+":"+"0"+str(self.minutes)
   ...:    def __add__(self, other):
   ...:        self.hours += other.hours
   ...:        self.minutes += other.minutes
   ...:        return Clock(self.hours, self.minutes)


In [5]: Clock(5, 6) + Clock(5,6)
Out[5]: 10:12

答案 2 :(得分:1)

我对您的代码有一些自由。首先,Clock方法看起来像是它试图转换为字符串。因此,让我们将其定义为__str__。我们还可以更简洁地实现字符串转换。

关于__add__方法。为了保持一致,它应该返回Clock对象,而不是字符串。

现有答案遗漏的另一件事是说明总分钟值超过59的情况,在这种情况下,超出的时间应包括在小时值中。

要计算分钟数,请取总分钟数的模数(%)60。对于小时数除以60并四舍五入(或只是进行整数除法)。函数divmod在一个函数调用中为我们方便地完成了这两件事。

class Clock:

    def __init__(self, hours, minutes):

        if minutes > 59:
            raise ValueError('invalid value for minutes %d' % minutes)

        self.hours = hours
        self.minutes = minutes

    def __str__(self):

        return "%d:%02d" % (self.hours, self.minutes)

    def __add__(self, other):

        extrahours, mins = divmod(self.minutes + other.minutes, 60)
        hours = self.hours + other.hours + extrahours
        return Clock(hours, mins)


t = Clock(5, 6) + Clock(5, 6)
print(t)

如果我们现在尝试

t = Clock(5, 20) + Clock(5, 50)

它正确打印11:10而不是10:70

答案 3 :(得分:-1)

是的,我知道,但是我不希望Clock(5,6)+ Clock(5,6)给出10:12 我希望Clock.Clock(5,6)+ Clock.Clock(5,6)给出10:12,而不是05:0605:06。 也许我误会了

代替: 在[5]中:Clock.Clock(5,6)+ Clock.Clock(5,6) 出[5]:05:0605:06

我想要: 在[5]中:Clock.Clock(5,6)+ Clock.Clock(5,6) 出[5]:10:12