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 minutes"""
        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
.128013s3_8ufvIy n7aêS1me(P24C:jtwiDh*)6o;bcdgM/T0làqAp!.rL-,}=+k%95{é050M0s0A0n0C0S0b0k0L0S0n0b0b0(010A0C0W010406050b0f0r0r0n0Z0j040p0I0S0f130I0l050P1a1c1e1g180W041p1w051z0P1z1B1w180M0C0h0{0}0 110E0C0N0E0S1P0E0A16050?0K0S0s1K0~10011O1Q1S1Q0A1Y1!1W0A0K0I0M1g1X0Z1x0A0E0{1j0b0W0n0l110v011$1M010g0^0s0l0n0r0s1W2123281(2b1!2e2g160a0k0u0Z0I0W0I0b0C1m0l0k0;1 0Z0Z0s0L2B1p2j0l1x0P1}2O0A1{1`1|0M2l111S0l2d2y1W1H1J0|1%2Y0C2!0l1@1I1W0W2H1x2M2O2_19222C2*292/0Z1d0S160k0q2L2}172|2k2 1(3133350v38233a2M2X013f0n34040k0c3j2N183m3d113p3r0k0w3v3l2}3n3B350-3F3x3H3z3o0I323q350H3M3b2~1L3e3R3g3s0m3W3y3Z3A3#3T3s0e3)3O3+3Q3S3C0,3;3c3?3J040q0R3{3Y2+3@3$0q371q393N3|443~0q3i493k4b43303-3r0q3u4h3w3X3I4m160q3E4q3G4c4l3^4v3L4y4j4t4C3 3V4F4s3P4e3(4L3*4d4u3 3:4Q3=4S4I0q3`4W4A3!4I0v414$4k4(3$0v482_4G4N4T0v4g4=4M3}4^4p4{4R4B4/4x504X523.0v4E554%3,4)4K5b4-5d4/4P5g4H4/4V5l4@4)4#5p4}4I0c4+5t4Y3$0c4;4a4|5z3.0c4`5D514.5G4 5J565L3r0c545O5c455G5a5U5h5W5R5f5Z5m5G5k5(5q5A5o5,5u5A5s5:5F3r0w5x5@575_5C4i5E5}160w5I605K5i3.0w5N665P685_5T6c5V3~0w5Y6h5!6j5%6m5)5_5+6q5-695/6u5;695?6y5^160-5{6C62040-5 4r675#6E656M6d6O6J6b2N1y2@1p2(2R0M2V3n0L1@2h1x6!1A6Y2{4y056)0;2^6S0*163d3F611(0B356}6N0l0L160D0f2H0s726S15040y3M0k7h0k6~116`040;0g7b5V703s7q5!0g0r160d0d2-2A7z7u3n7d0t7E3P0K7d0b0s0S7p6;6N7d0$3F7j73160E7I3?7S7U7k3o160r7Z447#4y7V6S0l160b7+297d0G7f4,3n7s7i7 7j7Q6S0b0M1601870i0l0b0?740C0n2K7|3P8435807h0!0s0`0r2-1l8o0k0=0k7M6)0l0;0`0M0I1I2d0A0k0o2S1#6)0r2?0C0`8F2H0k0R8u8G0-6B6R5V8j3s8l0k87017g8$7%7m1%0s0Z0A7$6N8q166G2N7/5V0I16020S0A0J0(8=7:7)948|8~900J975!8@040H8_7t6N0I7s230M9c3n9e9h8{5!8}048 91937.7%7;047?9z9j99919o3P9e9g8*8l7%7K7=7N7P2{9F040Y7@3e7X0s788o9I3?9u9y2_9s3I7X9M809O7L9R9X119u9W826i7)8r0A9$9E6S9)9%4d964F8$9,7J9=7O9@019_ad9B8x1n8Aa429a3a19|9C3M067 8,167oad7~ag0g162d0dai8za09T7c167H9{5!9P9C9?aL7F167`427}8k9NaQ8i85048(0x1n0h8/2z1n8u2CaE8A8(9/at6N7m2H0A781oaoaMab9S397%afaY3}9Z9#9D9+b2160Fal1(9e0c9g9rba040)bd11aN7Macb444b3aHap8q0l8sb839a99(bbbm019Kbi9Ubla}3nboaPbu9t169`bO9-aO8yak4Fas7iau7n0sb03k7%aybr30aA040n0z0I8s0dbwbyad7GadbMbqbS3P7-b97W04bwbzb(7RaS7{5y297~8+b+1(8!8(0Vb:1l2D1#c40kb@9 0ba;a78+6Nb|b%6W9UbRb1c20E9!2Hc58`bj0)9*bA7%b`cebna adbtcB95c39~aGcLbIbE9Bc4b_aSbE9u0P0PbEbGa=bZcvcQcOaebQag9}bxcqc)16cK3kbB7,aJb{c=b~bC9Vc_cVc{cXd0cIc!c`cG6^5V7_c}040+c-0C169LbXa?6_avb$ax71c?0lb-b/b;9 aD2IajdccyaI04aKd644cwc%047TbK4N9Q0LdhcMc8aU3PccaXdN29cg87cidDcl8w2I8pcWcr87c/7h9;9Qb}cT98d8dz16dCb=cpdIdi5!7GdMd}a~d{cxe63ncSc6cUa/e5d1am16bJc1eid:dQ0Gdlc+dodq9hdY04etct9Nc;eccRc^e0bUdHdhel1(anepdjd3c?dPc?egdJapejeLdedTb5bUdXc7eAdldne#44c.dsc:dub#edb)dyd(2m7x047z2H2?7Dc?cNe`cPeFf2dZ8h3?d$9:c?d*010O8O1#2d0k0g3#1#2x780k0S000n0g2b0L0E0n0N2hd@eC9:a@16a_a{bE0b0n16e@6N0b26a#ad2z160.d4f6f4c@d fX9BcDb7fRdp040%fRfPc9ea3nfS04fUeSd5f/3PeVeedUdab^fdf)f+fdf-f(fTfVaOd|ehd~cAga6ndVeKg5f*f,86ardt5V7mawc?b*fX7w7y0d0s0Uf1fXf3f_3?eTgz16dSePgeb.1l2Hesf.6H6 aWfcfXfe0Q8o8G0M000/0N3q2A0/cs4=a8b!fG0Za|gHbLf^gdefeHf!aB0ldFbVe5ez0teBg/f`c~c cHc20ngK7aeUg@gBa504aCeYdQg gle;gndvfM6Sgrhcb,gu2!gx0dhhg7bphneQdRdfgJ8JgMd!fagQatfda!8(gU8bd.1Hfu0/2H74fA8)fCgm5!a^0=fHe-29gDhqeNhbg=f}hfdGaFe(dKhih%h+040Xh49icUh7hEhafZh*3Ag_g{ggf7dLh04abYd_fEe?dx7tc?gte}0d1!gyi301gAh-gCg;eWe7gFhCh gLi8aTf944fbhJgShL87hN9 8w0C0{8v0I0K0z8v77798uhO0W1k0`6)788Gb;0kgZ3q0k0U0f1#friPiR8GiT0s1#iyhVd^eM7lfFh#g-bEh)irbsh,iubTh/g|h=hAh@h1d79w92ixh8eGi2j330i5hgi8jcibhY3ngodwgqe_ioij7z0n0M0Minjl1(iqj6aafWioc0cYh~jiiAgN8Y5!iEbZhK86d+jC2A0Ca,2E0L0=iK0M780/figWi^h8g(4ag*c20L1b0f0Sdlh|i|7(04i?h9gEdLad9qdQgGjN5Vk7i8k9dd8?f)eye)ia4ij@cUj_0rj{jjgcjIe$e2dEjok4e9jFf5g8hzbPjkkthdj8i7kykkh5a2enjhi0fXf{9Ajnh:bWkKkL17kmhl04g,g.kagIkokqe:ide=gpfXhpkA2ae|7z1a0KjEkG7^eRfXj2k}jGiwh^i4hDizk4iBcagP8#d%iofe1i0f8b0Z0n2Jj#2C2Ei_0k0TiN1.1#j+0Zj-j=klcue=8.8:kPl8k)g?9v9aj~d`kCi{kTb#900nj}hCk2hwc?kck4kekMkbkhk8ew04kidKkYicfDcU0;lRkrd9kv0si6h;lWl0itf|d7ksl kHg`kxjLaJkYj 9u0#lFk3iokSc2kIl{jp0Gl-l.js3Ph!a`j0l5k0l;0?3W0P6?0s2O2?mz6Z1I6#2R2T2P1?1^2R0n1ZmC0P6!18mP0=0@0_04.