Python: Surcharge: Difference between revisions

From Wiki Cours
Jump to navigation Jump to search
 
(10 intermediate revisions by the same user not shown)
Line 1: Line 1:
__NOTOC__
__NOTOC__
[[Memento_Python|<--Sommaire]]
[[Memento_Python|<--Sommaire]]
== Méthodes utiles ==
== Méthodes d'affichage ==


{| class="wikitable" border="1"
{| class="wikitable" border="1"
Line 26: Line 26:
| addition
| addition
| +
| +
| __add__
| __add__(self,other)
| +=
| +=
| __radd__
| __iadd__(self,other)
|-{{ligne grise}}
|-{{ligne grise}}
| soustraction
| soustraction
| -
| -
| __sub__
| __sub__(self,other)
| -=
| -=
| __rsub__
| __isub__(self,other)
|-----
|-----
| multiplication
| multiplication
| *
| *
| __mult__
| __mul__(self,other)
| *=
| *=
| __rmult__
| __imul__(self,other)
|-{{ligne grise}}
|-{{ligne grise}}
| division
| division
| /
| /
| __truediv__
| __truediv__(self,other)
| /=
| /=
| __rtruediv__
| __itruediv__(self,other)
|-----
|-----
| élévation à la puissance
| élévation à la puissance
| **
| **
| __pow__
| __pow__(self,other)
| **=
| **=
| __rpow__
| __ipow__(self,other)
|-----
|-----
| division entière
| division entière
| //
| //
| __floordiv__
| __floordiv__(self,other)
| //=
| //=
| __rfloordiv__
| __ifloordiv__(self,other)
|-{{ligne grise}}
|-{{ligne grise}}
| reste de la division entière (modulo)
| reste de la division entière (modulo)
| %
| %
| __mod__
| __mod__(self,other)
| %=
| %=
| __rmod__
| __imod__(self,other)
|}
|}


Line 74: Line 74:
| opposé
| opposé
| -
| -
| __neg__
| __neg__(self)
|-{{ligne grise}}
|-{{ligne grise}}
| positif
| positif
| +
| +
| __pos__
| __pos__(self)
|-{{ligne grise}}
|-{{ligne grise}}
| valeur absolue
| valeur absolue
Line 94: Line 94:
| égal
| égal
| ==
| ==
| __eq__
| __eq__(self,other)
|-{{ligne grise}}
|-{{ligne grise}}
| non égal
| non égal
| != ou <>
| != ou <>
| __ne__
| __ne__(self,other)
|-{{ligne grise}}
|-{{ligne grise}}
| strictement inférieur
| strictement inférieur
| <
| <
| __lt__
| __lt__(self,other)
|-{{ligne grise}}
|-{{ligne grise}}
| strictement supérieur
| strictement supérieur
| >
| >
| __gt__
| __gt__(self,other)
|-{{ligne grise}}
|-{{ligne grise}}
| inférieur ou égal
| inférieur ou égal
| <=
| <=
| __le__
| __le__(self,other)
|-{{ligne grise}}
|-{{ligne grise}}
| supérieur ou égal
| supérieur ou égal
| >=
| >=
| __ge__
| __ge__(self,other)
|-{{ligne grise}}
|-{{ligne grise}}
| comparaison
| comparaison
|  
|  
| __cmp__
| __cmp__(self,other)
|}
|}


Line 126: Line 126:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
! opération
! opération
! symbolisation ou fonction
! syntaxe
! méthode
! méthode
|-----
|-----
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)