• Aucun résultat trouvé

Python M´ethodes sp´eciales

N/A
N/A
Protected

Academic year: 2022

Partager "Python M´ethodes sp´eciales"

Copied!
11
0
0

Texte intégral

(1)

Python

M´ ethodes sp´ eciales

Nicolas Delestre

(2)

Les m´ ethodes sp´ eciales

Ensemble de m´ ethodes syst` emes ` a d´ efinir ou red´ efinir pour :

d´efinir le comportement de l’interp´eteur au regard des objets (par exemple comment les repr´esenter textuellement)

de pouvoir utiliser des op´erateurs ou fonctions standards avec les objets

d´efinir le comportement des objets dans certaines situations (comme par exemple dans les dictionnaires)

Ces m´ ethodes ont comme identifiant XX

init est la m´ethode sp´eciale ex´ecut´ee pour initialiser une nouvelle instance

(3)

Les m´ ethodes repr et str

La m´ ethode repr

Appel´ee par la fonctionrepr

C’est la m´ethode qui est ex´ecut´ee lorsque l’interpr´eteur affiche l’objet

Repr´esentation textuelle formelle (informatique) d’un objet (pourrait ˆetre utilis´ee pour cr´eer un nouvel objet)

Sans red´ efinition de repr

>>> classA:

....pass

>>> a=A()

>>> a

<__main__.Aobjectat 0x7f13bbd4d9d0>

Classe Point2D du module point.py

32 def__repr__(self):

33 if self.id:

34 returnf"Point2D({self.x}, {self.y}, ’{self.id}’)"

35 returnf"Point2D({self.x}, {self.y})"

>>> pt=Point2D(1,2,’A’)

>>> pt

Point2D(1, 2, ’A’)

>>> pt1=eval(repr(pt))

>>> pt1

Point2D(1, 2, ’A’)

(4)

Les m´ ethodes repr et str

La m´ ethode str

Appel´ee par la fonctionstr

Repr´esentation textuelle informelle (humaine) d’un objet

C’est la m´ethode qui est ex´ecut´ee lorsqu’on affiche l’objet ou que l’on cr´ee une chaˆıne format´ee

Classe Point2D du module point.py

1 def__str__(self):

2 prefixe = self.id

3 if notprefixe:

4 prefixe = ""

5 returnprefixe + f"({self.x},{self.y})"

>>> f"{pt}"

’A(1, 2)’

Si repr est d´efinie mais non str alors la repr´esentation informelle utilise repr (inverse non vrai)

(5)

Op´ erateurs (fonctions) binaires 1 / 4

Utilisation des op´ erateurs +, -, etc.

Il est possible de cr´eer des classes dont les instances pourront ˆetre utilis´ees comme op´erandes des op´erateursarithm´etiques, par exemple des classes : Vecteur, Matrice, Fonction

(math´ematique), etc.

>>> from vecteur import Vecteur2D

>>> u = Vecteur2D(1,2,’u’)

>>> v = Vecteur2D(2,3,’v’)

>>> u+v

Vecteur2D(3, 5, ’u+v’)

>>> u-v

Vecteur2D(-1, -1, ’u-v’)

(6)

Op´ erateurs (fonctions) binaires 2 / 4

M´ ethodes sp´ eciales add , sub , etc.

Il faut pour cela d´efinir les m´ethodes sp´eciales :

add (self, autre)pour l’op´erateur+ sub (self, autre)pour l’op´erateur- mul (self, autre)pour l’op´erateur* matmul (self, autre)pour l’op´erateur@ pow (self, autre[, modulo])pour l’op´erateur**ou la fonctionpow

truediv (self, autre)pour l’op´erateur/ floordiv (self, autre)pour l’op´erateur//

mod (self, autre)pour l’op´erateur% divmod (self, autre)pour la fonction divmod

lshift (self, autre)pour l’op´erateur<<

rshift (self, autre)pour l’op´erateur>>

and (self, autre)pour l’op´erateurand or (self, autre)pour l’op´erateuror xor (self, autre)pour l’op´erateurxor

Pour interpr´eterx + y, Python invoquex. add (y)

Si le type de l’argument (l’op´erande droite de l’op´erateur) n’est pas compatible avec l’objet, la valeur retourn´ee doit ˆetreNotImplemented

(7)

Op´ erateurs (fonctions) binaires 3 / 4

Classe Vecteur2D du module vecteur.py

5classVecteur2D:

6 def__init__(self, x:float, y:float, identifiant:str):

7 self._x = x

8 self._y = y

9 self._id = identifiant 10

11 @property 12 defx(self) ->float:

13 returnself._x

14

15 @property 16 defy(self) ->float:

17 returnself._y

18

19 @property 20 def id(self) ->str:

21 returnself._id

38 def__add__(self, vecteur_2d: Vecteur2D) -> Vecteur2D:

39 if not isinstance(vecteur_2d, Vecteur2D):

40 returnNotImplemented

41 returnVecteur2D(self.x + vecteur_2d.x,

42 self.y + vecteur_2d.y,

43 self.id+ "+" + vecteur_2d.id) 44

45 def__sub__(self, vecteur_2d: Vecteur2D) -> Vecteur2D:

46 if not isinstance(vecteur_2d, Vecteur2D):

47 returnNotImplemented

48 returnVecteur2D(self.x - vecteur_2d.x,

49 self.y - vecteur_2d.y,

50 self.id+ "-" + vecteur_2d.id) 51

52 def__mul__(self, vecteur_2d: Vecteur2D) ->float:

53 if not isinstance(vecteur_2d, Vecteur2D):

54 returnNotImplemented

55 returnself.x*vecteur_2d.x + self.y*vecteur_2d.y

(8)

Op´ erateurs (fonctions) binaires 4 / 4

M´ ethodes sp´ eciales r´ eflexives : radd , rsub , etc.

Si x + y est utilis´ ee et que la classe de x ne poss` ede pas la m´ ethode add ou qu’elle retourne NotImplemented, Python essaye d’interpr´ eter y. radd (x)

Si la classe de y ne d´ efinit la m´ ethode radd (self, other) ou qu’elle retourne NotImplemented alors une exception TypeError est lev´ ee

M´ ethodes sp´ eciales pour les op´ erations arithm´ etiques augment´ ees : iadd , isub , etc.

Utilis´ ees pour les op´ erateurs arithm´ etiques associ´ es ` a l’affectation : l’objet doit donc ˆ etre mutable

Si x += y (´ equivalent ` a x = x + y) est utilis´ ee alors Python interpr` ete x. iadd (y)

(9)

Op´ erateurs (fonctions) unaires

Pour utiliser les op´ erateurs unaires +, -, etc. il faut d´ efinir les m´ ethodes sp´ eciales :

pos (self)pour l’op´erateur+ neg (self)pour l’op´erateur- abs (self)pour la fonctionabs invert (self)pour l’op´erateur~

Classe Point2D du module point.py

43 def __abs__(self):

44 return Point2D(abs(self.x), abs(self.y))

>>> abs(Point2D(-3,2)) Point2D(3,2)

(10)

Fonctions de transtypage num´ eriques

int, float, etc.

L’utilisation d’une fonction de transtypage num´ erique appelle une m´ ethode sp´ eciale

int (self)pour la fonctionint round (self)pour la fonctionround float (self)pour la fonctionfloat complex (self)pour la fonctioncomplex

Classe Point2D du module point.py

46 def __complex__(self):

47 return complex(self.x, self.y)

>>> complex(Point2D(-3,2)) (-3+2j)

(11)

Conclusion

Nous avons vu dans ce cours Le rˆ ole des m´ ethodes sp´ eciales

Deux repr´ esentations des objets sous forme de chaine de caract` eres Comment permettre l’utilisation des op´ erateurs et fonctions usuels

Rappel : principe g´ en´ eral de python

Le concepteur/d´ eveloppeur d’une API ´ ecrit plus de code pour simplifier la vie de l’utilisateur

Références

Documents relatifs

Syntaxe de l’adressage indirect par registre en langage symbolique.- Comme nous l’avons d´ej` a vu, en langage symbolique, pour d´esigner une constante on ´ecrit celle-ci

Donner le nombre de composantes connexes et de trous pour l’objet de la figure 1, en 4- et 8- connexit´e.. On rappelle qu’un trou est une composante connexe du compl´ementaire

Calculer le nombre d’Euler (en 4- et 8-connexit´e pour l’objet) pour la figure 2 en utilisant la m´ethode globale et la m´ethode par d´enombrement des configurations locales. Figure

Le profil du relief au-dessus de l’axe Nord-Sud, dessin´e `a la question 2.b, est un ensemble de points dans le plan des variables y et z.. Exprimez cette ´equation `a l’aide de

Montrer que la trace est ind´ ependante du choix de la base hilbertienne de

bool upath user path cr´ee user path pour le chemin courant ; inclut ucache si bool est true initclip d´efinit le chemin d’incrustation au p´eriph´erique par d´efaut. clip

imprime toutes les lignes contenant le mot analyse suivi du mot lexical dans tous les fichiers de suffixe .tex. (L’option -i

S´ eparation des variables en dimension 3 et harmoniques sph´ eriques 21 Dans le cas d’une particule dans un potentiel ` a sym´ etrie sph´ erique nous avons l’invari- ance