Les durées en POO (2)

On s'intéresse dans cet exercice à une classe Duree dont on fournit le code ci-dessous.

La classe Duree
🐍 Script Python
class Duree:
    def __init__(self, h, m, s):
        """Instanciation
        Les minutes et secondes doivent être compris entre 0 et 59
        """
        assert 0 <= m < 60 and 0 <= s < 60
        self.heures = h
        self.minutes = m
        self.secondes = s

    def en_secondes(self):
        """Conversion en secondes"""
        return self.heures * 3600 + self.minutes * 60 + self.secondes

    def ajoute_minutes(self, mins):
        """Ajout de mins minutes"""
        self.heures += (self.minutes + mins) // 60
        self.minutes = (self.minutes + mins) % 60

    def ajoute_secondes(self, secs):
        """Ajout de secs secondes"""
        self.ajoute_minutes((self.secondes + secs) // 60)
        self.secondes = (self.secondes + secs) % 60

    def __repr__(self):
        """Mise en forme pour l'affichage"""
        return f"{self.heures}:{self.minutes}:{self.secondes}"

La méthode __repr__() est une méthode spéciale qui n'est pas directement appelée, mais appelée automatiquement lorsque l'on souhaite afficher une représentation de l'objet.

Dans le cas présent, cette méthode est appelée lorsque l'on souhaite convertir un objet de type Duree en une chaine de caractères (par exemple, lors de l'appel de la fonction print). Cette méthode renvoie une chaine de caractères sous la forme "hh:mm:ss". Par exemple, pour un objet initialisé avec les valeurs 3 h, 20 min et 2 s, la méthode renvoie '3:20:2'

On fournit ci-dessous des exemples d'utilisation :

>>> duree_1 = Duree(2, 45, 52)
>>> duree_1
2:45:52
>>> duree_1.en_secondes()
9952
>>> duree_1.ajoute_secondes(20)
>>> duree_1.en_secondes()
9972
>>> duree_1.ajoute_minutes(30)
>>> duree_1.en_secondes()
11772

On souhaite dans cet exercice ajouter des méthodes spéciales. Ces différentes fonctions sont exécutées lors de l'utilisation de l'opérateur correspondant (voir chaque exemple).

__eq__

La méthode __eq__ (pour equal) permet de tester l'égalité de deux objets de type Duree.

Cette méthode renvoie True si ces objets représentent la même durée, False dans le cas contraire.

Elle est automatiquement appelée lors de l'utilisation de l'opérateur ==.

>>> duree_1 = Duree(2, 45, 52)
>>> duree_2 = Duree(2, 45, 52)
>>> duree_3 = Duree(5, 12, 26)
>>> duree_1 == duree_2
True
>>> duree_1 == duree_3
False
__neq__

La méthode __neq__ (pour not equal) permet de tester la différence de deux objets de type Duree.

Cette méthode renvoie True si ces objets ne représentent pas la même durée, False dans le cas contraire.

Elle est automatiquement appelée lors de l'utilisation de l'opérateur !=.

>>> duree_1 = Duree(2, 45, 52)
>>> duree_2 = Duree(2, 45, 52)
>>> duree_3 = Duree(5, 12, 26)
>>> duree_1 != duree_2
False
>>> duree_1 != duree_3
True
__le__

La méthode __le__ (pour less than or equal) permet de comparer deux objets de type Duree.

Elle renvoie True si la durée représentée par le premier objet est inférieure ou égale à celle représentée par le second.

Elle est automatiquement appelée lors de l'utilisation de l'opérateur <=.

>>> duree_1 = Duree(2, 45, 52)
>>> duree_3 = Duree(5, 12, 26)
>>> duree_1 <= duree_3
True
>>> duree_3 <= duree_1
False
__add__

La méthode __add__ permet d'additionner les durées représentées par deux objets de type Duree.

Elle renvoie un nouvel objet de type Duree sans modifier les deux objets concernés par l'opération.

Elle est automatiquement appelée lors de l'utilisation de l'opérateur +.

>>> duree_1 = Duree(2, 45, 52)
>>> duree_3 = Duree(5, 12, 26)
>>> cumul = duree_1 + duree_3
>>> cumul
7:58:18
>>> duree_1
2:45:52
__sub__

La méthode __sub__ permet de soustraire les durées représentées par deux objets de type Duree.

Elle renvoie un nouvel objet de type Duree sans modifier les deux objets concernés par l'opération. Attention : avant d'effectuer l'opération, on vérifie que la durée à soustraire est inférieure ou égale à l'autre durée.

Elle est automatiquement appelée lors de l'utilisation de l'opérateur -.

>>> duree_1 = Duree(2, 45, 52)
>>> duree_3 = Duree(5, 12, 26)
>>> # duree_1 - duree_3 est impossible
>>> delta = duree_3 - duree_1
>>> delta
2:26:34
>>> duree_1
2:45:52

Compléter le code suivant.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 10/10
.128013:LpM%(40ed3; 1j}o5_êAn)h6,qcy!Cuvài2+Dms7=wlSIatf-9{rg.*TéPkb8/050k0j0W0V0J0S0O0n0C0S0V0O0O0Q010W0J0d010406050O0G0N0N0V0#0D040T0r0S0G130r0w050/1a1c1e1g180d041p1w051z0/1z1B1w180k0J0H0{0}0 110y0J0$0y0S1P0y0W16050?0-0S0j1K0~10011O1Q1S1Q0W1Y1!1W0W0-0r0k1g1X0#1x0W0y0{1j0O0d0V0w110K011$1M010X0^0j0w0V0N0j1W2123281(2b1!2e2g160a0n0+0#0r0d0r0O0J1m0w0n0;1 0#0#0j0C2B1p2j0w1x0/1}2O0W1{1`1|0k2l111S0w2d2y1W1H1J0|1%2Y0J2!0w1@1I1W0d2H1x2M2O2_19222C2*292/0#1d0S160n0o2L2}172|2k2 1(3133350K38233a2M2X013f0V34040n0l3j2N183m3d113p3r0n0h3v3l2}3n3B350s3F3x3H3z3o0r323q350z3M3b2~1L3e3R3g3s0P3W3y3Z3A3#3T3s0.3)3O3+3Q3S3C0Z3;3c3?3J040o0i3{3Y2+3@3$0o371q393N3|443~0o3i493k4b43303-3r0o3u4h3w3X3I4m160o3E4q3G4c4l3^4v3L4y4j4t4C3 3V4F4s3P4e3(4L3*4d4u3 3:4Q3=4S4I0o3`4W4A3!4I0K414$4k4(3$0K482_4G4N4T0K4g4=4M3}4^4p4{4R4B4/4x504X523.0K4E554%3,4)4K5b4-5d4/4P5g4H4/4V5l4@4)4#5p4}4I0l4+5t4Y3$0l4;4a4|5z3.0l4`5D514.5G4 5J565L3r0l545O5c455G5a5U5h5W5R5f5Z5m5G5k5(5q5A5o5,5u5A5s5:5F3r0h5x5@575_5C4i5E5}160h5I605K5i3.0h5N665P685_5T6c5V3~0h5Y6h5!6j5%6m5)5_5+6q5-695/6u5;695?6y5^160s5{6C62040s5 4r675#6E656M6d6O6J6b2N1y2@1p2(2R0k2V3n0C1@2h1x6!1A6Y2{4y056)0;2^6S0,163d3F611(0R356}6N0w0C160M0G2H0j726S15040b3M0n7h0n6~116`040;0X7b5V703s7q5!0X0N160t0t2-2A7z7u3n7d0g7E3P0-7d0O0j0S7p6;6N7d0A3F7j73160y7I3?7S7U7k3o160N7Z447#4y7V6S0w160O7+297d0x7f4,3n7s7i7 7j7Q6S0O0k1601870U0w0O0?740J0V2K7|3P8435807h0c0j0`0N2-1l8o0n0=0n7M6)0w0;0`0k0r1I2d0W0n0u2S1#6)0N2?0J0`8F2H0n0i8u8G0s6B6R5V8j3s8l0n87017g8$7%7m1%0j0#0W7$6N8q166G2N7/5V0r16020S0W0m0Q8=7:7)948|8~900m975!8@040z8_7t6N0r7s230k9c3n9e9h8{5!8}048 91937.7%7;047?9z9j99919o3P9e9g8*8l7%7K7=7N7P2{9F040%7@3e7X0j788o9I3?9u9y2_9s3I7X9M809O7L9R9X119u9W826i7)8r0W9$9E6S9)9%4d964F8$9,7J9=7O9@019_ad9B8x1n8Aa429a3a19|9C3M067 8,167oad7~ag0X162d0tai8za09T7c167H9{5!9P9C9?aL7F167`427}8k9NaQ8i85048(0F1n0H8/2z1n8u2CaE8A8(9/at6N7m2H0W781oaoaMab9S397%afaY3}9Z9#9D9+b2160(al1(9e0l9g9rba040Lbd11aN7Macb444b3aHap8q0w8sb839a99(bbbm019Kbi9Ubla}3nboaPbu9t169`bO9-aO8yak4Fas7iau7n0jb03k7%aybr30aA040V0p0r8s0tbwbyad7GadbMbqbS3P7-b97W04bwbzb(7RaS7{5y297~8+b+1(8!8(0vb:1l2D1#c40nb@9 0Oa;a78+6Nb|b%6W9UbRb1c20y9!2Hc58`bj0L9*bA7%b`cebna adbtcB95c39~aGcLbIbE9Bc4b_aSbE9u0/0/bEbGa=bZcvcQcOaebQag9}bxcqc)16cK3kbB7,aJb{c=b~bC9Vc_cVc{cXd0cIc!c`cG6^5V7_c}040fc-0J169LbXa?6_avb$ax71c?0wb-b/b;9 aD2IajdccyaI04aKd644cwc%047TbK4N9Q0CdhcMc8aU3PccaXdN29cg87cidDcl8w2I0`a/8ocs4=a89;9Qb}cT98d8dz16dCb=cpdIdi5!7GdMd}a~d{cxe63ncSc6cUd=dhd1am16bJc1eid:dQ0xdlc+dodq9hdY04etct9Nc;eccRc^e0bUdHekbjc cHc7dLd4eFc?egdJapejdleocYeqdWesdldndT3?c.dsc:dub#edb)dyd(2m7x047z2H2?7Dc?cNe@cPeSf1017_c95|6 aW9:c?d*010e8O1#2d0n0X3#1#2x780n0S000V0X2b0C0y0V0$2h87c/7hb!a_a{bE0O0V16e;6N0O26a#ad2z160!eRaOd|ehd~cAfW6nb6cFfPdp040qfPfNf7fZ3nfQ04fSc?dPeTeHf4c#cWdXfLf(f*fcf,f%fRfTbpfKa2f_eabTeXfcf f+86ardt5V7mawc?b*f47w7y0t0j0Be~f4f0gaaaf3gx7!16dSepap0V1l2Hesf-8Y5!d$fbf4fd0)8o8G0k000*0$3q2A0*d@4ad_a@16fE0#a|gEebfUg7fXd9aCgcgvaJeBg-efc~eN9icUgG8JeGd f`aB0wdFbVe5ez0gg`4abYfCg(e:dx7tdzb-7z2!gt0tdQe9f.gyg/dQgDe!gFgH7ae dZ8h3?gNatfca!8(gR8bd.1Hft0*2H74fz8)eC9:hhg*g,hyg.g6h3fYeVf!04g?dGaFf}dKhcdl0Eg~el9Yb.hAh%g=h7g@gAd2dLhd4ihfh^7ldvg:gMe?i029gpe`0t1!guic1(gwht3?f@g^dRdfh`h2hCeAgK4zia8#d%ij11gQgS1#2z0{8v0r0-0p8v77798uhM0d1k0`6)788Gb;0ngW3q0n0B0G1#fqiJiL8GiN0j1#h12Hg#4ig%e/hYbEioiBc@h4i|9Bh,h9h/djg_dl9w92iri:hBf4eUeedUh+h~h-bWiph;e-hge/glf4gni|ie7z0V0k0kiiimi1hsh)bLd5i|c0h!bTjagJd!hFfahHgPhJd+jw2A0Ja,2E0C0=9 2D780*fhgTi/hAi=3wi@ap0C1b0G0Sdlh@9A769#jbjFd3c?9qhwew04eyePhxdd8?f(k3dKi3j,cucUj/0Nj;h|eIe2dEh jz7^j}f4i{kn1(jdj^jgh8eKhrkbg d~eZk6h0h{f^i~ks3Ah6kxh.kzkAi5gi5!a^0=fFe*a504kfkhjmi601gkdwgmibkJ2ae_7z1a0-jyjCb kpi|krk?gBiqkW30e1kGipaThE44hGbZhI86871i0G8b0#0V2JjU2C2Eja0n0IiH1.1#0kj#hTfBk$8-0 8/8;k~h_jJlz9^9Gj8lC01k`17j-h*0;900Vj?iri-j{k,ilk{44j iuk5eO6SlXiplZkB9dk8e%hVkRbTlM0?kih5b.cjkljihaePjBjeinjEk,kuc2j1kyiujlg{3P9u0Yj9l1i|m2cUm4kNm60xkPkQe.gjg)kUg+irl:lO4L0/6?0j2O2?my6Z1I6#2R2T2P1?1^2R0V1ZmB0/6!18mO0=0@0_04.