2016-10-04 1 views
3

Je travaille sur l'exercice d'horloge exorcism.io et je n'arrive pas à comprendre pourquoi ce test échoue. Les résultats semblent identiques et ont même le même type.Chaîne ou objet compairson en Python 3.52

Voici mon code:

class Clock: 
    def __init__(self, h, m): 
     self.h = h 
     self.m = m 
     self.adl = 0 

    def make_time(self): 
     s = self.h * 3600 
     s += self.m * 60 
     if self.adl: s += self.adl 

     while s > 86400: 
      s -= 86400 

     if s == 0: 
      return '00:00' 

     h = s // 3600 

     if h: 
      s -= h * 3600 

     m = s // 60 
     return '{:02d}:{:02d}'.format(h, m) 

    def add(self, more): 
     self.adl = more * 60 
     return self.make_time() 

    def __str__(self): 
     return str(self.make_time()) # i don't think I need to do this 

if __name__ == '__main__': 
    cl1 = Clock(34, 37) #10:37 
    cl2 = Clock(10, 37) #10:37 
    print(type(cl2)) 
    print(cl2, cl1) 
    print(cl2 == cl1) #false 
+1

Vous n'avez pas défini de comparaison d'égalité pour ces objets, ils héritent donc de l'identité par défaut '==' de 'object'. – user2357112

+0

@ user2357112 C'était tout. Merci! Également nécessaire pour mettre la nouvelle heure et minute dans le dictionnaire personnel. – Eman

+0

S'il vous plaît ne pas ajouter une solution à votre question. Vous êtes invités à ajouter votre propre réponse ci-dessous à la place. Rappelez-vous que les posts de Stack Overflow sont destinés à être utiles aux futurs visiteurs ayant le même problème, et que les réponses sont votées indépendamment. –

Répondre

5

Une classe personnalisée sans __eq__ method par défaut pour les tests identité. C'est-à-dire que deux références à une instance d'une telle classe ne sont égales que si la référence précise le même objet.

Vous devez définir une méthode personnalisée __eq__ qui retourne True lorsque deux instances contiennent en même temps:

def __eq__(self, other): 
    if not isinstance(other, Clock): 
     return NotImplemented 
    return (self.h, self.m, self.adl) == (other.h, other.m, other.adl) 

En retournant le NotImplemented singleton pour quelque chose qui n'est pas une instance Clock (ou une sous-classe) , vous faites savoir à Python que l'objet other pourrait aussi être invité à tester l'égalité. Cependant, votre code accepte des valeurs supérieures aux plages normales des heures et des minutes; plutôt que les heures de magasin et minutes, secondes stocker et de normaliser cette valeur:

class Clock: 
    def __init__(self, h, m): 
     # store seconds, but only within the range of a day 
     self.seconds = (h * 3600 + m * 60) % 86400 
     self.adl = 0 

    def make_time(self): 
     s = self.esconds 
     if self.adl: s += self.adl 
     s %= 86400 
     if s == 0: 
      return '00:00' 

     s, h = s % 3600, s // 3600 
     m = s // 60 
     return '{:02d}:{:02d}'.format(h, m) 

    def __eq__(self, other): 
     if not isinstance(other, Clock): 
      return NotImplemented 
     return (self.seconds, self.adl) == (other.seconds, other.adl) 

Maintenant vos deux instances d'horloge interne test égales car ils stockent exactement le même temps dans une journée. Notez que j'ai utilisé l'opérateur de module % au lieu d'une boucle while et de la soustraction.

+0

J'ai ajouté une fonction eq comme votre suggestion. Le test dans __main__ fonctionne maintenant mais le test unitaire échoue toujours. AssertionError: ! = . – Eman

+0

@Eman: à droite, car il ne teste que si 'h' et' m' sont exactement égaux. Vous devez normaliser ces valeurs lorsque vous créez l'instance 'Clock'. –

+0

@Eman: J'ai ajouté une suggestion à cet effet, en normalisant les entrées 'h' et' m' à une valeur 'secondes'. –