Python: Surcharge: Difference between revisions

From Wiki Cours
Jump to navigation Jump to search
 
(5 intermediate revisions by the same user not shown)
Line 28: Line 28:
| __add__(self,other)
| __add__(self,other)
| +=
| +=
| __radd__(self,other)
| __iadd__(self,other)
|-{{ligne grise}}
|-{{ligne grise}}
| soustraction
| soustraction
Line 34: Line 34:
| __sub__(self,other)
| __sub__(self,other)
| -=
| -=
| __rsub__(self,other)
| __isub__(self,other)
|-----
|-----
| multiplication
| multiplication
| *
| *
| __mult__(self,other)
| __mul__(self,other)
| *=
| *=
| __rmult__(self,other)
| __imul__(self,other)
|-{{ligne grise}}
|-{{ligne grise}}
| division
| division
Line 46: Line 46:
| __truediv__(self,other)
| __truediv__(self,other)
| /=
| /=
| __rtruediv__(self,other)
| __itruediv__(self,other)
|-----
|-----
| élévation à la puissance
| élévation à la puissance
Line 52: Line 52:
| __pow__(self,other)
| __pow__(self,other)
| **=
| **=
| __rpow__(self,other)
| __ipow__(self,other)
|-----
|-----
| division entière
| division entière
Line 58: Line 58:
| __floordiv__(self,other)
| __floordiv__(self,other)
| //=
| //=
| __rfloordiv__(self,other)
| __ifloordiv__(self,other)
|-{{ligne grise}}
|-{{ligne grise}}
| reste de la division entière (modulo)
| reste de la division entière (modulo)
Line 64: Line 64:
| __mod__(self,other)
| __mod__(self,other)
| %=
| %=
| __rmod__(self,other)
| __imod__(self,other)
|}
|}


Line 139: Line 139:
| accès aux éléments en écriture
| accès aux éléments en écriture
| objet[key]
| objet[key]
| __setitem__(self,key)
| __setitem__(self,key,value)
|-{{ligne grise}}
|-{{ligne grise}}
|}
|}
== 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):
<source lang="python">
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)
</source>

Latest revision as of 14:03, 6 September 2016

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