Introduction à La Programmation Objet En Python

3y ago
38 Views
2 Downloads
296.89 KB
52 Pages
Last View : 12d ago
Last Download : 3m ago
Upload by : Camryn Boren
Transcription

Introduction à la programmation objet en PythonIntroduction à la programmation objet en PythonXavier Crégut Prénom.Nom@enseeiht.fr ENSEEIHTSciences du NumériqueXavier Crégut (N7)Introduction à la programmation objet en Python1 / 52

Objectifs et structure de ce supportObjectifs de ce support :une introduction à la programmation objeten l’illustrant avec le langage Pythonet le diagramme de classe de la notation UML (Unified Modelling Language)Principaux éléments :Exemple introductif : passage de l’impératif à une approche objetEncapsulation : classe, objets, attributs, méthodes, etc.Relations entre classesRelations d’utilisationRelation d’héritageQuelques éléments spécifiques à PythonIntrospectionMéthodes spéciales et redéfinitions des opérateursMétaclassesDes éléments méthodologiques

Introduction à la programmation objet en PythonExemple introductifSommaire1Exemple introductif2Classes et objets3Relations entre classes4Méthodes spécialesXavier Crégut (N7)Les robotsIntroduction à la programmation objet en Python3 / 52

Introduction à la programmation objet en PythonExemple introductifLes robotsModéliser un robotExercice 1 Modéliser un robot capable d’avancer d’une case et de pivoter de 90 vers ladroite. On pourra alors le guider de la salle de cours (position initiale du robot) jusqu’ausecrétariat.SecrétariatRobotXavier Crégut (N7)Introduction à la programmation objet en Python4 / 52

Introduction à la programmation objet en PythonExemple introductifLes robotsTypes et sous-programmes associés (pseudo-code)1. On sait définir un type Robot :2. On sait modéliser ses opérations :RobotType1 Enregistrementx: Entier;-- abscissey: Entier;-- ordonnéedirection: DirectionFinEnregistrementProcédure avancer(r: in out RobotType1)-- faire avancer le robot rDébut.FinDirection (NORD, EST, SUD, OUEST)3. On sait utiliser des robots :Variabler1, r2: RobotType1;Débutinitialiser(r1, 4, 10, EST)initialiser(r2, 15, 7, SUD)avancer(r1)pivoter(r2)FinXavier Crégut (N7)Procédure pivoter(r: in out RobotType1)-- faire pivoter le robot r-- de 90 à droiteDébut.FinProcédure initialiser(r: out RobotType1x, y: in Entier, d: in Direction)-- initialiser le robot r.Débutr.x - xr.y - yr.direction - dFinIntroduction à la programmation objet en Python5 / 52

Module Robot en Python (fichier robot dict.py)1234567""" Modèle très limité de robot qui ne sait qu’avancer d’unecase et pivoter à droite de 90 . Il est repéré par son abscisse x,son ordonnée y et sa direction (un entier dans 0.3)."""directions (’nord’, ’est’, ’sud’, ’ouest’)# direction en clairdx (0, 1, 0, -1)# incrément sur X en fonction de la directiondy (1, 0, -1, 0)# incrément sur Y en fonction de la direction891011def robot(x, y, direction):""" Créer un nouveau robot. """return { ’x’: x, ’y’: y, ’direction’: directions.index(direction) }121314151617def avancer(r):""" Avancer le robot r d’une case dans la direction courante. """direction r[’direction’]r[’x’] dx[direction]r[’y’] dy[direction]18192021def pivoter(r):""" Pivoter de 90 à droite le robot r. """r[’direction’] (r[’direction’] 1) % 42223242526def afficher(r, *, prefix ’’):""" Afficher le robot r. """print(’{}Robot(x {}, y {}, direction {})’\.format(prefix, r[’x’], r[’y’], directions[r[’direction’]]))

Introduction à la programmation objet en PythonExemple introductifLes robotsCommentaires sur le module Robot en PythonPas de définition explicite du type Robotles données du robot sont stockées dans un dictionnaire (type dict), tableau associatifsyntaxe un peu lourde : r[’x’]les notions d’objet et de classe seront de meilleures solutionsRemarque : on pourrait utiliser le type namedtuple de collections (mais immuable).Type énuméré Direction représenté par un entier.Remarque : Python offre le module enum pour définir des types énumérés.dx et dy sont des tuples indicés par la direction du robotdonnent l’entier à ajouter à x ou y pour déplacer le robot en fonction de sa directionsimplification du code de translater, évite des if.directions permet d’obtenir le nom en clair de la directionutilisé à la créationutilisé à l’affichageles éléments qui commencent pas un souligné ( ) sont considérés comme locauxun utilisateur du module ne devrait pas les utiliserXavier Crégut (N7)Introduction à la programmation objet en Python7 / 52

Introduction à la programmation objet en PythonExemple introductifLes robotsUtilisation du module Robot en Python1from robot dict import *2345678910r1 robot(4, 10, ’est’)afficher(r1, prefix ’r1 r2 robot(15, 7, ’sud’)afficher(r2, prefix ’r2 pivoter(r1)afficher(r1, prefix ’r1 avancer(r2)afficher(r2, prefix ’r2 ’)’)’)’)Et le résultat :r1r2r1r2 Robot(x 4, y 10,Robot(x 15, y 7,Robot(x 4, y 10,Robot(x 15, y 6,Xavier Crégut (N7)direction est)direction sud)direction sud)direction sud)Introduction à la programmation objet en Python8 / 52

Introduction à la programmation objet en PythonExemple introductifLes robotsModule : Encapsulation des données (types) et traitements (SP)Principe : Un type (prédéfini ou utilisateur) n’a que peu d’intérêt s’il n’est pas équipéd’opérations !Justifications :éviter que chaque utilisateur du type réinvente les opérationsfavoriser la réutilisationModule : Construction syntaxique qui regroupe des types et les opérations associéesIntérêt des modules :structurer l’application à un niveau supplémentaire par rapport aux sous-programmes (conceptionglobale du modèle en V) ;factoriser/réutiliser le code (type et SP) entre applications ;améliorer la maintenance : une évolution dans l’implantation d’un module ne devrait pas avoird’impact sur les autres modules d’une application ;faciliter le test : le modules sont testés individuellement.Question : Pourquoi séparer données et traitements ?Approche objet : regrouper données et SP dans une entité appelée classeXavier Crégut (N7)Introduction à la programmation objet en Python9 / 52

Introduction à la programmation objet en PythonExemple introductifLes robotsVersion objet1. Modéliser les robots :Classe Données TraitementsRobotType1x : Entiery : Entierdirection : Directionavancerpivoterinitialiser(in x, y : int,in d : Direction)Notation UML :Nom de la structeurs(initialisation)Xavier Crégut (N7)2. Utiliser les robotsVariabler1, r2: RobotType1Débutr1.initialiser(4, 10, EST)r2.initialiser(15, 7, SUD)r1.pivoterr2.avancerFinr1 : RobotType1x 4y 10direction EST SUDavancerpivoterinitialiser(in x, y : int,in d : Direction)(objet r1)Introduction à la programmation objet en Pythonr2 : RobotType1x 15y 76direction SUDavancerpivoterinitialiser(in x, y : int,in d : Direction)(objet r2)10 / 52

Introduction à la programmation objet en PythonExemple introductifLes robotsClasses et objetsClasse : moule pour créer des données appelées objetsspécifie l’état et le comportement des objetséquivalent à un type équipé des opérations pour en manipuler les donnéesObjet : donnée créée à partir d’une classe (instance d’une classe)une identité : distinguer deux objets différentsr1 et r2 sont deux objets différents, instances de la même classe Roboten général, l’identité est l’adresse de l’objet en mémoireun état : informations propres à un objet, décrites par les attributs/champsexemple : l’abscisse, l’ordonnée et la direction d’un robotpropre à chaque objet : r1 et r2 ont un état différentun comportement : décrit les évolutions possibles de l’état d’un objet sous la formed’opérations (sous-programmes) qui lui sont appliquablesexemples : avancer, pivoter, etc.une opération manipule l’état de l’objetRemarque : On ne sait pas dans quel ordre les opérations seront appelées. mais il fautcommencer par initialiser l’objet : c’est le rôle du constructeur (initialiser).Xavier Crégut (N7)Introduction à la programmation objet en Python11 / 52

Introduction à la programmation objet en PythonExemple introductifLes robotsPremière version de la classe Robot en Python (robot.py)class Robot:""" Robot qui sait avancer d’une case et pivoter à droite de 90 .Il est repéré par son abscisse x, son ordonnée y et sa direction."""definit (self, x, y, direction):""" Initialiser le robot self à partir de sa position (x, y) et sa direction. """self.x xself.y yself.direction ’nord est sud ouest’.split().index(direction)def avancer(self):""" Avancer d’une case dans la direction.# mettre à jour self.xif self.direction 1: # estself.x 1elif self.direction 3: # ouestself.x - 1# mettre à jour self.yif self.direction 0: # nordself.y 1elif self.direction 2: # sudself.y - 1Xavier Crégut (N7)"""Introduction à la programmation objet en Python12 / 52

Introduction à la programmation objet en PythonExemple introductifLes robotsPremière version de la classe Robot en Python (robot.py) (2)def pivoter(self):""" Pivoter ce robot de 90 vers la droite.self.direction (self.direction 1) % 4"""def afficher(self, *, prefix ’’):print(prefix ’({}, {}) {}’.format(self.x, self.y, \’nord est sud ouest’.split()[self.direction]))1Expliquer les différents éléments qui apparaissent sur cette classe.2Expliquer comment a été modélisé le robot, en particulier que représente direction.3Indiquer les critiques que l’on peut faire sur ce code et comment l’améliorer.Xavier Crégut (N7)Introduction à la programmation objet en Python13 / 52

Introduction à la programmation objet en PythonExemple introductifLes robotsUtilisation de la classe Robot en Python (fichier exemple robot.py)1from robot import Robot234567891011121314r1 Robot(4, 10, ’est’)r1.afficher(prefix ’r1 ’)r2 Robot(15, 7, ’sud’)r2.afficher(prefix ’r2 ’)r1.pivoter()r1.afficher(prefix ’r1 ’)r2.avancer()r2.afficher(prefix ’r2 ’)Robot.pivoter(r2)# syntaxe "classique"Robot.afficher(r2, prefix ’r2 ’)print(’Robot.pivoter :’, Robot.pivoter)print(’r2.pivoter :’, r2.pivoter)Et le résultat :r1 (4, 10) estr2 (15, 7) sudr1 (4, 10) sudr2 (15, 6) sudr2 (15, 6) ouestRobot.pivoter : function Robot.pivoter at 0x7f0b128429d8 r2.pivoter : bound method Robot.pivoter of robot.Robot object at 0x7f0b12847748 Xavier Crégut (N7)Introduction à la programmation objet en Python14 / 52

Classe Robot en Python (fichier robot.py)12345678class Robot:""" Robot qui sait avancer d’une case et pivoter à droite de 90 .Il est repéré par son abscisse x, son ordonnée y et sa direction."""# des attributs de classedirections (’nord’, ’est’, ’sud’, ’ouest’)# direction en clairdx (0, 1, 0, -1)# incrément sur X en fonction de la directiondy (1, 0, -1, 0)# incrément sur Y en fonction de la direction91011121314def init (self, x, y, direction):""" Initialiser le robot self à partir de sa position (x, y) et sa direction. """self.x xself.y yself.direction Robot. directions.index(direction)1516171819def avancer(self):""" Avancer d’une case dans la direction.self.x Robot. dx[self.direction]self.y Robot. dy[self.direction]"""20212223def pivoter(self):""" Pivoter ce robot de 90 vers la droite.self.direction (self.direction 1) % 4"""242526def afficher(self, *, prefix ’’):print(prefix, self, sep ’’)272829def str (self):return ’({}, {}) {}’.format(self.x, self.y, Robot. directions[self.direction])

Introduction à la programmation objet en PythonExemple introductifLes robotsPassage d’UML à PythonLe diagramme UML donne le squelette de la classe Pythonclass Robot:""" . """RobotType1 x : Entier y : Entier direction : Direction- dx : String [4]- dy : String [4]- directions : String [4] avancer pivoter initialiser(in x, y : int,in d : Direction) : privé (local à la classe) : public (accessible de tous)souligné : niveau classedirections .dx .dy .def init (self, x, y, direction):# constructeur""" . """self.x .# définir les attributs d’instanceself.y .self.direction .def avancer(self):""" . """passdef pivoter(self):""" . """passdef str (self):return .Xavier Crégut (N7)# les attributs de classe# pour convertir en chaîneIntroduction à la programmation objet en Python16 / 52

Introduction à la programmation objet en PythonExemple introductifLes robotsExercicesExercice 2 : DateProposer une modélisation UML d’une classe Date.Exercice 3 : Monnaie1Modéliser en UML une classe Monnaie. Une monnaie est caractérisée par une valeur (int) etune devise (str) et possède les opérations ajouter et retrancher pour respectivementajouter et retrancher à cette monnaie une autre monnaie. Les deux monnaies doivent avoirmême devise sinon l’exception TypeError est levée.2Écrire deux tests. Le premier ajoute à la monnaie m1 de 5 euros la monnaie m2 de 7 euroset vérifie que m1 vaut bien 12 euros. Le deuxième retranche à m1 m2 et vérifie que lavaleur de m1 est -2.3Écrire en Python la classe Monnaie.Exercice 4 : FractionProposer une modélisation UML d’une classe Fraction.Xavier Crégut (N7)Introduction à la programmation objet en Python17 / 52

Introduction à la programmation objet en PythonClasses et objetsSommaire1Exemple introductif2Classes et objets3Relations entre classes4Méthodes spécialesXavier Crégut (N7)ClasseObjetAttributsMéthodesPython : un langage hautementdynamiqueInformation privéesComment définir une classeIntroduction à la programmation objet en Python18 / 52

Introduction à la programmation objet en PythonClasses et objetsClasseClasseUne classe définit :un Unité d’encapsulation : elle regroupe la déclaration des attributs et la définition desméthodes associées dans une même construction syntaxiqueclass NomDeLaClasse:# Définition de ses caractéristiquesattributs stockage d’information (état de l’objet).méthodes unités de calcul (sous-programmes : fonctions ou procédures).C’est aussi un espace de noms :deux classes différentes peuvent avoir des membres de même nomun TYPE qui permet de :créer des objets (la classe est un moule, une matrice) ;Les méthodes et attributs définis sur la classe comme « unité d’encapsulation » pourront êtreappliqués à ses objets.Xavier Crégut (N7)Introduction à la programmation objet en Python19 / 52

Introduction à la programmation objet en PythonClasses et objetsObjetObjetObjet : donnée en mémoire qui est le représentant d’une classe.l’objet est dit instance de la classeUn objet est caractérisé par :un état : la valeur des attributs (x, y, etc.) ;un comportement : les méthodes qui peuvent lui être appliquées (avaner, etc.) ;une identité : identifie de manière unique un objet (p.ex. son adresse en mémoire).Un objet est créé à partir d’une classe (en précisant les paramètres effectifs de sonconstructeur, sauf le premier, self) :Robot(4, 10, ’Est’)Robot(direction ’Sud’, x 15, y 7)# création d’un objet Robot# c’est comme pour les sous-programmesretourne l’identité de l’objet crééEn Python, les objets sont soumis à la sémantique de la référence :la mémoire qu’ils occupent est allouée dans le tas (pas dans la pile d’exécution)seule leur identité permet de les désignerLes identités des objets sont conservées dans des variables (des noms) :r1 Robot(4, 10, ’Est’)r2 Robot(direction ’Sud’, x 15, y 7)Xavier Crégut (N7)Introduction à la programmation objet en Python20 / 52

AttributsOn distingue :les attributs d’instance : spécifique d’un objet (x, y, direction)les attributs de classe : attaché à la classe et non aux objets ( dx, dy, directions, etc.)123456789101112131415161718192021class A:ac 10 # Attribut de classedef init (self, v):self.ai v # ai attribut d’instancea A(5)#-----------------------------assert a.ai 5assert A.ac 10assert a.ac 10# on a accès à un attribut de classe depuis un objet# A.ai # AttributeError: type object ’A’ has no attribute ’ai’b A(7)#-----------------------------assert b.ai 7assert b.ac 10b.ai 11#-----------------------------assert b.ai 11 # normal !assert a.ai 5# ai est bien un attribut d’instanceA.ac 20#-----------------------------assert A.ac 20# logique !assert b.ac 20# l’attribut de classe est bien partagé par les instancesb.ac 30#-------------- Est-ce qu’on modifie l’attribut de classe ac ?assert b.ac 30# peut-êtreassert A.ac 20# mais non ! b.ac 30 définit un nouvel attribut d’instance2223assert A is type(a) and A is a. class# obtenir la classe d’un objet

Introduction à la programmation objet en PythonClasses et objetsMéthodesMéthodesUne méthode d’instance est un sous-programme qui exploite l’état d’un objet (en accèset/ou en modification).Le premier paramètre désigne nécessairement l’objet. Par convention, on l’appelle self.Une méthode de classe est une méthode qui travaille sur la classe (et non l’objet).Elle est décorée @classmethod.Son premier paramètre est nommé cls par convention.@classmethoddef changer langue(cls, langue):if langue.lower() ’fr’:cls. directions (’nord’, ’est’, ’sud’, ’ouest’)else:cls. directions (’north’, ’east’, ’south’, ’west’)Robot.changer langue(’en’)# UtilisationUne méthode statique est une méthode définie dans l’espace de nom de la classe mais estindépendante de cette classe.Elle est décorée @staticmethodclass Date:.@staticmethoddef est bissextile(annee):return annee % 4 0 and (annee % 100 ! 0 or annee % 400 0)Xavier Crégut (N7)Introduction à la programmation objet en Python22 / 52

Introduction à la programmation objet en PythonClasses et objetsMéthodesQuelques méthodes particulières (méthodes spéciales)init (self, .) : le constructeur : méthode d’initialisation nécessairementappelée quand on crée un objet. Voir aussi new , T. 23.C’est le constructeur qui devrait définir les attributs d’instance de la classe.del (self) : le destructeur, appelé quand une instance est sur le point d’être détruite.repr (self) : chaîne représentant cet objet et qui devrait correspondre (quand c’estpossible) à une expression Python valide pour créer l’objet.str (self) : utilisée par str() pour obtenir la représentation sous forme d’une chaînede caractères lisible de l’objet. Si non définie, retourne le résultat de repr .Remplace avantageusement la méthode afficher !new (cls, .) : méthode implicitement statique qui crée l’objet (et appelleinit ).bool (self) : utilisée quand l’objet est considéré comme booléen et avec la fonctionprédéfinie bool().Voir #special-method-namesXavier Crégut (N7)Introduction à la programmation objet en Python23 / 52

Introduction à la programmation objet en PythonClasses et objetsPython : un langage hautement dynamiquePython : un langage hautement dynamiqueEn Python, on peut ajouter ou supprimer des attributs (et des méthodes) sur un objet, uneclasse, etc.1from robot import Robot23456r1 Robot(4, 10, ’est’)print(’r1 ’, r1)r2 Robot(15, 7, ’sud’)print(’r2 ’, r2)78r1.nom "D2R2"# on a ajouté un nom à r1 mais r2 n’a pas de nom91011def tourner gauche(robot):robot.direction (robot.direction 3) % 41213Robot.pivoter gauche tourner gauche141516r2.pivoter gauche()print(’r2 ’, r2)# direction devient ’est’del r1.xr1.avancer()# suppression d’un attribut# AttributeError: ’Robot’ object has no attribute ’x’171819À éviter !Xavier Crégut (N7)Introduction à la programmation objet en Python24 / 52

Introduction à la programmation objet en PythonClasses et objetsInformation privéesInformation privées (locales)Élément essentiel pour l’évolution d’une application :Tout ce qui est caché peut encore être changé.Tout ce qui est visible peut avoir été utilisé. Le changer peut casser du code existant.Pas d’information privées en Python mais une convention :ce qui commence par un souligné « » ne devrait pas être utilisé.Traitement spécifique pour un élément qui commence par deux soulignés (nom préfixé par celui dela classe). Simule une information privée.Propriété sur les objets :avoir une syntaxe identique à la manipulation d’un attribut (en accès ou modification) mais parl’intermédiaire de méthodes et donc avec contrôle !Exemple : contrôler l’« attribut » mois d’une Date (compris entre 1 et 12).Principe de Python :12On commenc

Xavier Crégut (N7)Introduction à la programmation objet en Python17/52. Introduction à la programmation objet en Python Classes et objets Sommaire 1 Exemple introductif 2 Classes et objets 3 Relations entre classes 4 Méthodes spéciales Classe Objet Attributs Méthodes Python : un langage hautement

Related Documents:

Cours c et programmation orientée objet Programmation orientée objet 3 UMMTO Apparu dans les années 60s au sein de MIT Offre une grande souplesse de travail maintenance aisée Objet en programmation objet dans le monde réel Objet propriétés (attributs ) actions (méthodes ) Objet en C Structure de données (objet simple ) Classe

La programmation objets expliquée aux programmeurs Si vous êtes programmeur, mais habitué aux langages de programmation "procéduraux" (pascal, fortran, C, perl, etc.), ce chapitre est pour vous: il essaie d'expliquer comment on peut passer de la programmation procédurale à la programmation objet, via la programmation structurée.

Programmation Orientée Objet Java Enseignant : Ramzi Mahmoudi mahmoudr@esiee.fr Année Universitaire: 2012/2013. Plan des chapitres 1. Introduction 2. Les bases du langage 33. La Programmation Objet avec Java 2 44. Des concepts avancés de la programmation orientée objet Java 55. Les classes de base

34 Programmation objet 34.1 Programmation objet 34.2 Mot clé new 34.3 Object methods and fields 34.4 Function et prototype 34.5 mot clé this 34.6 paradigme de programmation classe/objet 35 Notation JSON 35.1 Tableau 35.2 Objet 35.3 Imbrications 35.4 Voir aussi 36 Ajax 36.1 Ajax : comment créer un sommaire 36.1.1 Intérêt de l'utilisation d .

La programmation oriente objet(POO) I. La programmation orientée objet La programmation orientée objets (POO) est une technique d'organisation du code d'un programme en le groupant en objets, les objets étant ici des éléments individuels comportant des informations (valeurs de données) et des fonctionnalités. L'approche orientée objet .

LA PROGRAMMATION OBJET EN JAVA Michel Divay M. DIVAY IUT BTS Licence Écoles d'ingénieurs LA PROGRAMMATION OBJET EN JAVA Michel Divay COURS 9 782100 496976 ISBN 2 10 049697 2 LA PROGRAMMATION OBJET EN JAVA www.dunod.com Ce livre s'adresse aux étudiants en IUT, BTS, licences et écoles d'ingénieurs des filières informatiques.

Programmation Orientée Objet en C# 1 Introduction 1.1 Présentation Tout bon développeur le sait, le code d'un programme doit être propre, commenté, facile à maintenir et à améliorer. Vous êtes adepte de la programmation procédurale et souhaitez apprendre la programmation objet ? Alors ce tutoriel est fait pour vous.

The energy intensity target in China’s 11th Five-Year Plan period - Local implementation and achievements in Shanxi Province Daisheng Zhanga,*, Kristin Aunanb,a, Hans Martin Seipa,b, Haakon Vennemoc a Department of Chemistry, University of Oslo, P. O. Box 1033 Blindern, 0315 Oslo, Norway b Center for International Climate and Environmental Research — Oslo (CICERO), P.O. Box 1129 Blindern .