Surcharge des opérateurs
Script python
class matrice:
   def __init__ (self, laListe):
      self.liste =[]
      self.liste = laListe
      print "creation de matrice!!"
      
   def __add__(self,autreMatrice =[]):
      
      if len (autreMatrice)- len (self) == 0:
         matriceSomme =[]
         #initialisation
         for valeur in range(0, len (self.liste)):
            matriceSomme.append(0)
         
         #somme
         for valeur in range(0, len (self.liste)):
            matriceSomme[valeur] = self.liste[valeur] + autreMatrice.liste[valeur]
         return matrice(matriceSomme) #renvoie d'une autre instance
         
      else:
         print " les matrices doivent être de même taille !"
     
   def __repr__ (self):
       return str( self.liste)
    
   def __len__(self):
       return len(self.liste)
    
    #permet de tester " for i in matrice", "if i in matrice" et l'acces matrice[i]
   def __getitem__(self, indice):
      return self.liste[indice]
   def __delitem__(self,indice):
      del self.liste[indice]
   
   def __setitem__ (self, cle,valeur):
      self.liste[cle] = valeur
   
   def __del__(self):
      del self.liste 
      print "destruction de matrice!"
   def __getattr__(self, nomAttribut):
      if nomAttribut == "valeur":
         print "la matrice n'a pas d'attribut 'valeur'. Utilise matrice.liste"
         return None
      else:
         raise AttributeError, nomAttribut
   
   #sur self > x, x == self, cmp(self,x) .... renvoie -1,0,1 si inferieur,0,superieur
   def __cmp__(self, autreMatrice):
      #on definit la comparaison avec ces matrices "spéciales" en sommant tous les
      #element de la liste et en comparant cette somme
      sommeSelf =0
      sommeAutre =0
      
      def calculSommeListe(laMatrice):
         somme = 0
         for valeur in laMatrice:
            somme += valeur
         return somme
      
      sommeSelf = calculSommeListe (self)
      sommeAutre = calculSommeListe(autreMatrice)
      
      if(sommeSelf>sommeAutre):return 1
      elif (sommeSelf == sommeAutre): return 0
      else: return -1
         
   def afficheMethodesEtAttributs(self):
      print
      print "affichage des méthodes"
      for methode in dir(self):
         print methode
print "mat1"
mat1 = matrice([1,2,3])
print mat1
print "mat2"
mat2 = matrice([3,2,1])
print mat2
print "SURCHARGE DE + avec __add__"
print "mat3 :mat1 +mat2"
mat3 = mat1 + mat2
print mat3
print
print "matrice de taille differente"
print "mat 4"
mat4 = matrice([70,3,26,1])
print mat4
print "mat 1"
print mat1
print" mat1 + mat4"
mat5 = mat1+mat4
print
print "SURCHARGE INDICAGE:__getitem__ et __setitem__"
print "la matrice 1: " + str(mat1)
#indicage __getitem__ : pour acceder aux valeurs, il faut surcharger __getitem__
print "la matrice 1: mat1[2] :        " + str( mat1[2])
#indicage __setitem__
print "on modifie la valeur- pour que ce soit possible il faut surcharger __setitem__: mat1[2] = 28"
mat1[2] =28
print "la matrice 1: mat1[2] = 20 :        " + str(mat1)
#
print
print "TEST D'appartenance et iteration dans boucle grace à__getitem__ surchargé"
print "element de mat4"
for element  in mat4:
   print "#" + str( element ),
print
if 2 in mat1:
   print "2 appartient à mat1"
   
if not 20 in mat1:
   print "mais pas 20"
print
#essais avec des attributs inexistant
print"TEST De GESTION des attributs inexistants"
print "---------"
print "avec des attributs inexistant mais accepté"
print mat1.valeur
print "---------"
try:
      
   print "avec des attributs inexistant mais non accepté"
   print mat1.nimporteQuoi
   print "---------"
except (AttributeError):
   print "Attribut qui n'a aucun sens sur une matrice !"
#essais de comparaison:
print
print "TEST COMPARAISON grace à la surcharge de __cmp__:"
print "mat6"
mat6 = matrice([1,2,3])
print mat6
print "mat7"
mat7 = matrice([3,2,1])
print mat7
if (mat6 == mat7):
   print "matrice égale!"
print
print "mat8:"
mat8 = matrice([3,8,9])
print mat8
if (mat6 == mat8):
   print "matrice égale!"
elif mat6 > mat8:
   print "mat6 superieur à mat8"
elif mat6 < mat8:
    print "mat6 inférieur à mat8"
print
print "TEST affichage des methodes de la classe"
#affichage des methodes de la classes matrices
mat8.afficheMethodesEtAttributs()
print
print "TEST de DESTRUCTION D'un item puis destruction de la class:"
print" Surcharge de  __DELITEM__ et __del__"
#__DELITEM__
print mat4
print"del mat4[3]"
del mat4[3]
print mat4
#~ #DEL
del mat4
try:
      print mat4
except (NameError):
   "mat4 a bien été détruite!"
print "-----------------------"
print "fin de l'application"
print" destruction des autres matrices"
Page HTML
Ce code est exemple d'utilisation de la surcharge des opérateurs (pour inventer une nouvelle algèbre, par exemple en donnant un sens à la somme de deux matrices en utilisant le signe '+') pour toutes suggestions: fabricedefougerolles@yahoo.fr
Résultat
Début de la page HTML >"C:\python22\pythonw.exe" -u "D:\user\fabrice\cours\python\exemples pythons\essais surcharge operateur .py" mat1 creation de matrice!! [1, 2, 3] mat2 creation de matrice!! [3, 2, 1] SURCHARGE DE + avec __add__ mat3 :mat1 +mat2 creation de matrice!! [4, 4, 4] matrice de taille differente mat 4 creation de matrice!! [70, 3, 26, 1] mat 1 [1, 2, 3] mat1 + mat4 les matrices doivent être de même taille ! SURCHARGE INDICAGE:__getitem__ et __setitem__ la matrice 1: [1, 2, 3] la matrice 1: mat1[2] : 3 on modifie la valeur- pour que ce soit possible il faut surcharger __setitem__: mat1[2] = 28 la matrice 1: mat1[2] = 20 : [1, 2, 28] TEST D'appartenance et iteration dans boucle grace à__getitem__ surchargé element de mat4 #70 #3 #26 #1 2 appartient à mat1 mais pas 20 TEST De GESTION des attributs inexistants --------- avec des attributs inexistant mais accepté la matrice n'a pas d'attribut 'valeur'. Utilise matrice.liste None --------- avec des attributs inexistant mais non accepté Attribut qui n'a aucun sens sur une matrice ! TEST COMPARAISON grace à la surcharge de __cmp__: mat6 creation de matrice!! [1, 2, 3] mat7 creation de matrice!! [3, 2, 1] matrice égale! mat8: creation de matrice!! [3, 8, 9] mat6 inférieur à mat8 TEST affichage des methodes de la classe affichage des méthodes __add__ __cmp__ __del__ __delitem__ __doc__ __getattr__ __getitem__ __init__ __len__ __module__ __repr__ __setitem__ afficheMethodesEtAttributs liste TEST de DESTRUCTION D'un item puis destruction de la class: Surcharge de __DELITEM__ et __del__ [70, 3, 26, 1] del mat4[3] [70, 3, 26] destruction de matrice! ----------------------- fin de l'application destruction des autres matrices destruction de matrice! destruction de matrice! destruction de matrice! destruction de matrice! destruction de matrice! destruction de matrice! >Exit code: 0 Time: 1.057
Pour ajouter un opérateur dans l'interpréteur python directement : (en) http://www.geocities.com/chrootstrap/adding_python_operators.html
