Nous allons nous pencher dans cet article sur une manière d’utiliser la POO en Python afin d’ajouter des durées. Oui, j’aime ce paradigme de programmation…
POO et Python: ajouter des durées, la classe
Le constrtucteur
class time: def __init__(self,*L): if len(L) != 3: print('Erreur! Vous devez mettre 3 arguments. Ex: time(h,min,sec).') else: self.h = L[0] self.min = L[1] self.sec = L[2] if (L[1] > 60) or (L[2] > 60): r = self + time(0,0,0) self.h = r.h self.min = r.min self.sec = r.sec
Ici, j’ai décidé d’insérer en argument avec l’opérateur splat (le “*”), pour faciliter la saisie de mon objet ultérieurement. Cela permet d’insérer un argument sous une autre forme qu’une liste où qu’un tuple.
Comme je souhaite construire un objet de la forme:
time(hh,mm,ss)
je souhaite que la longueur de mon argument soit égal à 3.
Le test : “if (L[1] > 60) or (L[2] > 60):” va me permettre de “simplifier” les saisies. Par exemple, on a:
>>> t = time(5,78,89)
>>> t.h, t.min, t.sec
(6, 19, 29)
En effet, avoir 78 minutes et 89 secondes ne m’intéresse pas. Je veux que le nombre de minutes et de secondes soient compris entre 0 et 59 (inclus).
La méthode d’affichage
Afin d’afficher de façon plus harmonieuse mon objet, je vais implémenter la méthode qui va nous permettre un affichage formaté:
def __str__(self): return '{} h {:0>2} min {:0>2} s'.format(self.h, self.min, self.sec)
>>> t = time(5,78,89)
>>> print( t )
6 h 19 min 29 s
>>> t = time(1,1,1)
>>> print( t )
1 h 01 min 01 s
Remarquez que les “0” sont automatiquement insérés grâce à la méthode format.
La méthode d’ajout
def __add__(self,b): total_s = self.sec + b.sec retenue = total_s // 60 r_sec = total_s % 60 total_m = self.min + b.min + retenue retenue = total_m // 60 r_min = total_m % 60 total_h = self.h + b.h + retenue return time( total_h , r_min , r_sec )
C’est cette méthode qui nous permet d’ajouter deux durées.
Quand, dans le constructeur, j’ai écrit:
r = self + time(0,0,0)
cette opération fait appel à cette méthode. En effet, quand on tape “+”, il se passe quelque chose derrière tout ça…
POO et Python: ajouter des durées, les tests
Tests basiques
Nous allons maintenant effectuer quelques tests:
>>> print( time(4,5,8) + time(1,1,1) )
5 h 06 min 09 s
Cet exemple basique nous montre que la méthode d’addition fonctionne. Il faut maintenant vérifier que si la somme des secondes et/ou des minutes est supérieure à 60, elle affiche le bon résultat:
>>> print( time(4,48,8) + time(7,45,54) ) 12 h 34 min 02 s
Tests avec boucle
Pour être honnête avec vous, j’ai écrit cette classe car je devais ajouter un grand nombre de durées. Voici la boucle:
if __name__ == '__main__': L = [(0,0,23) , (0,1,12), (0,2,3), (0,1,42), (0,1,31), (0,1,24), (0,0,26), (0,1,36), (0,1,10), (0,0,40), (0,0,20), (0,2,51),\ (0,3,49), (0,0,22), (0,1,54), (0,1,59), (0,1,46), (0,2,47), (0,2,51), (0,2,56), (0,3,1), (0,2,52) , (0,2,17), (0,1,25), \ (0,1,22) , (0,5,11), (0,3,46), (0,1,28), (0,2,11), (0,0,24), (0,2,14), (0,0,46), (0,2,48)] s = time(0,0,0) for i in L: s += time(i[0], i[1], i[2]) print(s)
>>> 1 h 03 min 27 s
POO et Python: la classe complète
class time: def __init__(self,*L): if len(L) != 3: print('Erreur! Vous devez mettre 3 arguments. Ex: time(h,min,sec).') else: self.h = L[0] self.min = L[1] self.sec = L[2] if (L[1] > 60) or (L[2] > 60): r = self + time(0,0,0) self.h = r.h self.min = r.min self.sec = r.sec def __str__(self): return '{} h {:0>2} min {:0>2} s'.format(self.h, self.min, self.sec) def __add__(self,b): total_s = self.sec + b.sec retenue = total_s // 60 r_sec = total_s % 60 total_m = self.min + b.min + retenue retenue = total_m // 60 r_min = total_m % 60 total_h = self.h + b.h + retenue return time( total_h , r_min , r_sec )
POO et Python: ajouter des durées, adaptation possible
Comme vous avez pu le remarquer, je ne compte pas les jours (car cela ne m’importait peu dans mon cas). Mais il est bien évidemment possible d’adapter le constructeur ainsi que la méthode d’addition pour cela.
Le module “time”
Il existe bien entendu une autre méthode que de construire cette classe: l’appel au module time. Le code suivant est inspiré d’un code trouvé sur la page https://openclassrooms.com/forum/sujet/addition-d-heures-et-de-minutes.
from datetime import timedelta >>> t1 = timedelta(hours = 4, minutes = 45, seconds = 56) >>> t2 = timedelta(hours = 3, minutes = 13, seconds = 47) >>> t = t1 + t2 >>> print(t) 7:59:43
Mais avouez que la saisie est tout de même plus fastidieuse, non ? (taper “hours”, “minutes”, “seconds”… la galère!).