[PageD'Accueil] [IndexDesTitres] [IndexDesTermes

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


2016-06-05 21:43