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!).


0 0 votes
Évaluation de l'article
S’abonner
Notification pour
guest
0 Commentaires
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
0
Nous aimerions avoir votre avis, veuillez laisser un commentaire.x