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