Wiki Python Fr   SurchargeDesOperateurs UserPreferences
 
HelpContents FindPage Diffs Info Edit Subscribe XML Print View

1. Surcharge des opérateurs

1.1. Script python

  1 
  2 
  3 
  4 
  5 
  6 
  7 
  8 
  9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
 35 
 36 
 37 
 38 
 39 
 40 
 41 
 42 
 43 
 44 
 45 
 46 
 47 
 48 
 49 
 50 
 51 
 52 
 53 
 54 
 55 
 56 
 57 
 58 
 59 
 60 
 61 
 62 
 63 
 64 
 65 
 66 
 67 
 68 
 69 
 70 
 71 
 72 
 73 
 74 
 75 
 76 
 77 
 78 
 79 
 80 
 81 
 82 
 83 
 84 
 85 
 86 
 87 
 88 
 89 
 90 
 91 
 92 
 93 
 94 
 95 
 96 
 97 
 98 
 99 
100 
101 
102 
103 
104 
105 
106 
107 
108 
109 
110 
111 
112 
113 
114 
115 
116 
117 
118 
119 
120 
121 
122 
123 
124 
125 
126 
127 
128 
129 
130 
131 
132 
133 
134 
135 
136 
137 
138 
139 
140 
141 
142 
143 
144 
145 
146 
147 
148 
149 
150 
151 
152 
153 
154 
155 
156 
157 
158 
159 
160 
161 
162 
163 
164 
165 
166 
167 
168 
169 
170 
171 
172 
173 
174 
175 
176 
177 
178 
179 
180 
181 
182 
183 
184 
185 
186 
187 
188 
189 
190 
191 
192 
193 
194 
195 
196 
197 
198 
199 
200 
201 
202 
203 
204 
205 
206 
207 
208 
#!/usr/bin/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"

1.2. 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

1.3. 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

PythonPowered