POO

Introduction

Qu'est-ce qu'une classe ?

Définir une classe, c'est définir un nouveau type.

Un exemple

On veut définir un type "Point" qui représentera des points du plan.

On propose pour cela le code suivant (quelques commentaires suivront) :


class Point:
	
	def __init__(self, nom, abscisse, ordonnee):
		"""
		Constructeur.
		"""
		self.nom = nom
		self.x = abscisse # abscisse du point
		self.y = ordonnee # ordonnée du point
		
	def translate(self, ux, uy):
		"""
			Méthode de translation du point par le vecteur u(ux;uy).
		"""
		self.x += ux
		self.y += uy
		
	def distance(self, autrePoint):
		"""
		Renvoie la distance du point à un autre point.
		"""
		dx = self.x - autrePoint.x
		dy = self.y - autrePoint.y
		return (dx**2 + dy**2)**0.5
		
	def rayon(self):
		"""
		Méthode renvoyant le rayon polaire du point
		(longueur du segment d'extrémités l'origine du repère et le point).
		"""
		return self.distance(Point("O",0,0)) 
		
		
	def affichage(self):
		print("Le point {} a pour coordonnées ({};{}).".format(self.nom, self.x, self.y))
		
		
if __name__ == "__main__":	
	a = Point('A', 2, 3)
	b = Point('B', 4, 5)


	print("L'abscisse du point A est égale à {}.".format(a.x))
	print("Distance entre les points A et B : {}.".format(a.distance(b)))
	print("Rayon polaire du point A : {}.".format(a.rayon()))

	a.affichage()
	print("\nTranslation du point A par le vecteur (10;10) :")
	a.translate(10,10)
	a.affichage()

On obtient :

 
L'abscisse du point A est égale à 2.
Distance entre les points A et B : 2.8284271247461903.
Rayon polaire du point A : 3.605551275463989.
Le point A a pour coordonnées (2;3).

Translation du point A par le vecteur (10;10) :
Le point A a pour coordonnées (12;13).
  • Le code définissant la classe Point a défini un nouveau type, c'est à dire le modèle d'objets.
  • Le code a = Point('A', 2, 3) (ligne 36) définit une instance de la classe Point, c'est à dire un objet de type Point.
  • a.nom, a.x et a.y sont les attributs nom, x, et y de l'objet a. Ils ont pour valeurs initiales celles données dans le code a = Point('A', 2, 3) : a.nom = 'A', a.x = 2, a.y = 3.
  • Les fonctions définies sont appelées méthodes. Ainsi a.affichage() appelle la méthode affichage() sur l'objet a. Dans le code définissant la classe, on lit def affichage(self):, le paramètre self désigne l'objet avec lequel on appelera la méthode. Dans l'appel a.affiche(), c'est donc a qui est associé à self et joue donc le rôle du premier paramètre. L'instruction a.affiche() pourrait d'ailleurs aussi s'écrire Point.affichage(a).
  • De même, vous pouvez tester le code Point.distance(a,b) et constater qu'il est équivalent au code a.distance(b).
  • Le mot self pour représenter l'instance en cours de définition pourrait être remplacé par un autre mot (mais l'usage est d'utiliser self). Par contre la présence, en première position, d'un paramètre désignant l'instance en cours de définition est obligaoire.
  • Remarquez que la fonction translate ne renvoie rien : elle agit directement sur les attributs du point (et elle pourrait aussi éventuellement renvoyer une valeur).