Python: Surcharge

From Wiki Cours
Jump to: navigation, search

<--Sommaire

Méthodes d'affichage

utilisation nom
conversion en string pour print __str__(self)
affichage __repr__(self)

Opérations mathématiques

Définir ou redéfinir les opérateurs standards permet d'utiliser les symboles mathématiques pour de nouveaux objets:

opération symbole méthode symbole unaire méthode
addition + __add__(self,other) += __iadd__(self,other)
soustraction - __sub__(self,other) -= __isub__(self,other)
multiplication * __mul__(self,other) *= __imul__(self,other)
division / __truediv__(self,other) /= __itruediv__(self,other)
élévation à la puissance ** __pow__(self,other) **= __ipow__(self,other)
division entière // __floordiv__(self,other) //= __ifloordiv__(self,other)
reste de la division entière (modulo)  % __mod__(self,other)  %= __imod__(self,other)
opération symbole méthode
opposé - __neg__(self)
positif + __pos__(self)
valeur absolue abs() __abs__(self)

Opérateurs de comparaison

opération symbole méthode
égal == __eq__(self,other)
non égal  != ou <> __ne__(self,other)
strictement inférieur < __lt__(self,other)
strictement supérieur > __gt__(self,other)
inférieur ou égal <= __le__(self,other)
supérieur ou égal >= __ge__(self,other)
comparaison __cmp__(self,other)

Opérateurs de conteneurs

destinés à des objets pouvant être des conteneurs

opération syntaxe méthode
dimension len(objet) __len__(self)
accès aux éléments en lecture objet[key] __getitem__(self,key)
accès aux éléments en écriture objet[key] __setitem__(self,key,value)

Un exemple

Une classe qui gère l'affiche de l'heure en temps (pas réaliste mais montre bien l'encapsulation des données et la surcharge):

class Temps:
   
    def __init__(self,h=0,m=0,s=0):
        self.heure = h
        self.minute = m
        self.seconde = s
        
    def __str__(self):
        return str(self.heure)+'h' \
            + str(self.minute)+'mn' \
            + str(self.seconde)+'s'

    def __add__(self,other):
        if not other.__class__ is Temps:
            print "Erreur: l'argument n'est pas un Temps"
            return NotImplemented
        res = Temps()        
        res.seconde = (self.seconde+other.seconde)%60
        res.minute = (self.minute+other.minute + (self.seconde+other.seconde)//60)%60
        res.heure = self.heure+other.heure + (self.minute+other.minute)//60
        return res
    
t1,t2 = Temps(1,24,48), Temps(0,52,32)
print(t1, t2, t1+t2)