Introduction à la POO
Objets : attributs et création¶
Le libraire du coin de votre rue décide de faire appel à vous pour informatiser son système de gestion de livres : l'objectif de ce tp est de comprendre comment on peut structurer les informations se rapportant à un livre, ainsi que les opérations que l'on peut effectuer sur les livres (en calculer le prix, par exemple) dans un ensemble cohérent.
En python, le mot-clé class permet de définir un nouveau type : c'est une nouvelle structure de donnée permettant de représenter, structurer et manipuler des objets.
class Livre:bksl-nl passbksl-nlbksl-nllivre1 = Livre()bksl-nlbksl-nl
Attributs d'un objet¶
Le code ci-dessous permet d'ajouter différents attributs au livre : son titre (La peste), son auteur (Albert Camus), et son nombre total de page (59).
livre1.titre = "La peste"bksl-nllivre1.auteur = "Camus Albert"bksl-nllivre1.nbpy-undpages = 59bksl-nlbksl-nl
-
Utiliser Thonny pour inspecter l'objet
livre1: dans le menu Affichage, faire afficher les panneaux Variables et Inspecteur d'objets en cliquant sur ces entrées. Une fois le panneau Inspecteur d'objets ouvert, cliquer sur le bouton Attributs. Commenter. -
Écrire le code python permettant de représenter le livre Fondation (256 pages), écrit par Isaac Asimov en 1951.
1 2 3 4 5
livre2 = Livre() # À compléter livre2.titre = ... livre2.auteur = ... livre2.nb_pages = ...
Création d'un nouveau livre¶
Écrire une fonction créer_livre qui prend en argument une chaine de caractère t, une chaîne de caractères a et un entier positif n et qui renvoie l'objet de type Livre de titre t, d'auteur a et constitué de n pages.
Utiliser la fonction créer_livre pour initialiser une variable livre3 représentant le livre de votre choix.
def créerpy-undlivre(t, a, n):bksl-nl """ str, str, int -> Livrebksl-nl Renvoie un nouveau livre """bksl-nl passbksl-nlbksl-nl
Fonction __init__¶
Dans un nouveau fichier intitullé introduction_init.py, copier-coller le code suivant. Ouvrir ce fichier avec Thonny, puis l'exécuter.
class Livre:bksl-nl def py-undpy-undinitpy-undpy-und(self, t, a, n):bksl-nl self.titre = tbksl-nl self.auteur = abksl-nl self.nbpy-undpages = nbksl-nlbksl-nl
-
Dans la console de Thonny, exécuter l'instruction
Livre("Les misérables", "Hugo Victor", 2135"). Observer l'effet sur l'état de la mémoire. Commenter. -
À quoi peut server la fonction
__init__placée dans le corps de la classeLivre?
Premières fonctions¶
Afficher un livre¶
Le libraire est un peu perturbé par l'effet de l'instruction print(livre1) : il préfèrerait un affichage plus lisible. La fonction affiche prend en argument un objet de type Livre et réalise un affichage partiel des informations du livre.
Modifier la fonction affiche afin que l'appel affiche(livre1) indique également le nom de l'auteur du livre dans la description affichée. Tester votre modification sur les variables de type Livre déjà définies.
def affiche(lvr):bksl-nl """ Livre -> Nonebksl-nl Affiche le livre lvr """bksl-nl titrepy-undlivre = lvr.titrebksl-nl pagespy-undtot = lvr.nbpy-undpagesbksl-nl print(f"< Livre '{titrepy-undlivre}', nombre de pages {pagespy-undtot} >")bksl-nlbksl-nl
Prix d'un livre¶
Prix de base¶
Ce libraire un peu simplet calcule le prix de tous ses livres de la même manière : tous ses livres coûtent 12 centimes la page. Ainsi un livre constitué de 100 pages coûte 1,2€.
Écrire une fonction prix_base qui étant donné un livre lvr et un flotant prix_page renvoie le prix du livre en euros.
def prixpy-undbase(lvr, prixpy-undpage):bksl-nl """ Livre, int -> floatbksl-nl Calcule le prix de base d'un livre, à prixpy-undpage centimes la page """bksl-nl passbksl-nlbksl-nl
Prix réduit¶
Il arrive au libraire (qui est simplet, mais pas radin) de faire occasionnellement des réductions sur le prix des livres.
Écrire une fonction prix_reduit qui étant donné un livre lvr, un prix de vente à la page prix_page et un pourcentage de réduction reduc (un entier compris entre 0 et 100) calcule le prix du livre, après une réduction de reduc pourcent.
def prixpy-undréduit(lvr, prixpy-undpage, reduc):bksl-nl """ Livre, float, int -> floatbksl-nl Renvoie le prix du livre après réduction """bksl-nl passbksl-nlbksl-nl
Méthodes d'un objet¶
Sur ce même modèle, on peut imaginer :
- d'autres attributs pour la classe livre. Ils permettent d'ajouter de l'information à la description de l'objet.
- d'autres fonctions opérant sur les objets de type livre. Elles permettent de manipuler un livre.
Afin de structurer efficacement notre code, nous allons va encapsuler toutes ces informations dans la classe qui représente notre objet.
Toutes les réponses aux questions suivantes du tp devront être écrites dans un fichier intitulé librairie.py.
class Livre:bksl-nl def py-undpy-undinitpy-undpy-und(self, t, a, n):bksl-nl self.titre = tbksl-nl self.auteur = abksl-nl self.nbpy-undpages = nbksl-nlbksl-nl def affiche(self):bksl-nl """ Livre -> None """bksl-nl titrepy-undlivre = self.titrebksl-nl auteurpy-undlivre = self.auteurbksl-nl pagespy-undtot = self.nbpy-undpagesbksl-nl print(f"< Livre '{titrepy-undlivre}', auteur {auteurpy-undlivre}, nombre de pages {pagespy-undtot} >")bksl-nlbksl-nl def prixpy-undbase(self, prixpy-undpage):bksl-nl """ Livre -> floatbksl-nl Calcule le prix de base d'un livre, à 12 centimes la page """bksl-nl return prixpy-undpagepy-strself.nbpy-undpagesbksl-nl bksl-nl def prixpy-undréduit(self, prixpy-undpage, reduc):bksl-nl """ Livre, int -> floatbksl-nl Renvoie le prix du livre après réduction """bksl-nl # return (1 - reduc/100)py-strself.nbpy-undpagespy-str0.12bksl-nl return (1 - reduc/100)py-strself.prixpy-undbase(prixpy-undpage)bksl-nlbksl-nl
Méthodes d'un objet : utilisation¶
Exécuter dans la console les lignes du code suivant. Commenter la syntaxe utilisée.
livre4.affiche()bksl-nllivre4.prixpy-undbase(0.12)bksl-nllivre4.prixpy-undréduit(0.12, 50)bksl-nlbksl-nl
Ajout d'un attribut¶
Ajouter un attribut disponible à la classe Livre : il s'agit d'un entier positif ou nul qui représente combien de livres de ce type sont disponibles. L'attribut disponible d'un livre aura pour valeur par défaut 1.
bksl-nlbksl-nllivre1 = Livre("La peste", "Camus Albert", 59)bksl-nllivre2 = Livre("Fondation", "Asimoov Isaac", 265)bksl-nllivre4 = Livre("Les misérables", "Hugo Victor", 2135)bksl-nlbksl-nl
Reception d'un livre¶
Écrire une méthode recevoir de la classe Livre : cette méthode prend comme argument un entier nombre n correspondant au nombre de copies supplémentaires du livre self. Celles-ci seront ajoutées aux copies disponibles du livre : on modifiera pour cela l'attribut disponible.
Attention. On rappelle que le code de cette fonction devra être écrit dans la classe Livre.
1 2 3 4 | |
Vente d'un livre¶
Écrire une méthode vendre de la classe Livre simule la vente du livre self :
- si aucun livre de ce type n'est disponible, la méthode renverra
0. - sinon : on calcule le prix du livre (avec le prix par page et la réduction passés en arguments) et on décrémente de 1 l'attribut
disponibledelvr. La méthode renverra le prix du livre.
1 2 3 | |
Gestion d'une librairie¶
Introduction et motivation¶
Notre libraire cherche maintenant à gérer une collection de livre. Son stock de livre ne faisant qu'augmenter, il souhaite pouvoir répondre aux clients lui demandant s'il possède ou non un livre dont on lui donne le titre. Écrire une fonction recherche qui étant donné une liste de livres collection et un titre, renvoie le nombre d'exemplaires disponibles du livre intitulé titre que possède le libraire.
def recherche(collection, titre):bksl-nl """ [Livre], str -> intbksl-nl Nombre de livres disponible avec le titre indiqué dans la collection. """bksl-nl passbksl-nlbksl-nl
La classe Librairie¶
Afin de structurer efficacement notre code, on décide de regrouper toutes les fonctions opérant sur une collection de livres dans une classe intitulée Librairie. Ainsi, à l'aide de cette classe, le libraire pourra efficacement gérer l'ensemble des livres de sa librairie. Dans le code ci-dessous, l'attribut collection est un objet de type list constitué d'objets de type Livre.
class Librairie:bksl-nl def py-undpy-undinitpy-undpy-und(self, c):bksl-nl self.collection = cbksl-nlbksl-nl
-
Avec quelle instruction peut-on représenter une librairie vide (ne contenant aucun livre) ?
-
Initialiser une variable
libde typeLibrairiereprésentant une librairie contenant les livres suivants :- 8 exemplaires du livre La peste, d'Albert Camus (59 pages) ;
- 2 exemplaires du livre Fondation, d'Isaac Asimov (256 pages) ;
- 15 exemplairs du livre Les misérables, de Victor Hugo (2135 pages) ;
- 5 exemplaires du livre Harry Potter à l'école des sorciers, de J. K. Rowling (132 pages)
Ajouter un livre dans une librairie¶
-
Écrire une méthode
ajoutede la classeLibrairiequi prend en argument un objetlvrde typeLivreet qui l'ajoute à la librairie représentée parself.1 2 3 4
def ajoute_livre(self, lvr): """ Librairie, Livre -> None Ajoute le livre lvr à la librairie self """ pass -
Écrire le code python qui permette d'ajouter à la variable
libdéfinie précédemment 11 exemplaires du livre Le roi Babar (15 pages), écrit par Jean de Brunhoff.bksl-nlbksl-nl###def testpy-undajoutepy-undlivre():bksl-nl """ Tests pour la fonction ajoutepy-undlivre """bksl-nl print("Tests de ajoutepy-undlivre passés avec succès.")bksl-nl return Truebksl-nlbksl-nl# from tp import ajoutepy-undlivrebksl-nl# testpy-undajoutepy-undlivre()bksl-nlbksl-nl 5/5
Afficher l'ensemble des livres de la librairie¶
Écrire une méthode affiche de la classe Librairie qui affiche les informations de tous les livres présents dans la librairie self. On pourra faire appel à la méthode affiche de la classe Livre.
1 2 3 4 | |
Calculer le bénéfice total¶
Écrire une méthode bénéfice de la classe Librairie qui renvoie le bénéfice total généré par la vente de tous les exemplaires de tous les livres de la librairie self. Cette fonction prendra comme argument prix_page, un flottant représentant le prix par page fixé par le libraire.
1 2 3 4 | |
À vous de jouer¶
-
Ajouter un nouvel attribut de votre choix à la classe
Livre.Écrire une méthode de la classe
Livrequi ajoute une fonctionnalité aux objets de typeLivre(à vous de l'inventer !). -
Ajouter un nouvel attribut de votre choix à la classe
Librairie.Écrire une méthode de la classe
Librairiequi ajoute une fonctionnalité aux objets de typeLibrairie(à vous de l'inventer !).
Documents¶
-
Fichiers python :