Vous pouvez me contacter via Facebook pour questions & suggestions : Page Facebook relative à mon site
En Python tout est objet.
De même que Monsieur Jourdain faisait de la prose sans le savoir, vous faites avec Python, de la POO (Programmation Orientée Objet)
sans vous en rendre compte ; vous avez manipulé dès le départ des instances de classe, des méthodes de classes.
Regardez attentivement cette suite de commandes :
Quand vous écrivez type(maliste) l'interface retourne le message : class 'list'
La variable "maliste" est en effet un objet de type "list" ; on dit aussi une instance de la classe "list".
Ensuite vous manipulez cet objet de la classe 'list' et alors vous rencontrez deux syntaxes différentes :
Len() est une fonction générique qui peut s'appliquer à des objets de
types différents (appartenant à différentes classes).
Vous connaissez d'autres fonctions natives : abs(), dir(), round(), print(), type(), range(), input(), range(), etc.
Par contre count() & index() sont des fonctions spécifiques la classe 'list' ; on parle plus précisément de méthodes de classe.
Pour appliquer une méthode de classe à un objet de ladite classe, il faut utiliser la notation pointée : nomObjet.méthode(arguments éventuels).
Nous abordons dans ce chapitre un gros morceau qui peut faire peur : la POO (Programmation Orientée Objet).
Rassurez vous, comme vous êtes déjà familiarisé avec les classes, les instances de classe et les méthodes de classe, ça devrait pas poser
pour vous de grosses difficultés.
Prenons un exemple tiré de la vie courante pour illustrer la POO.
Médor est un chien. Pendant une journée typique, il fait diverses actions: il mange, il court, il dort, etc.
En POO on utilise les termes suivants : classe, instance de classe (ou objet), attributs et méthodes de classe.
La relation entre un attribut OU une méthode et l’objet est indiquée par un point écrit entre les deux. C'est ce qu'on appelle la notation pointée.
La POO correspond à une autre manière d’imaginer, de construire et d’organiser son code.
Python est résolument orienté objet, tout est construit autour de la notion d'objet.
Pour véritablement maitriser Python il est donc indispensable de comprendre la composante orientée objet.
Notez que j'ai systématiquement utilisé des chaines formatées ("f string") pour les affichages.
nom de p1 : Albert et âge de p1 27 nom de p2 : Evelyne et âge de p2 : 47 nom et âge modifiés de p1 Einstein 28 class '__main__.Personne'> class '__main__.Personne'>
Ce programme crée une classe nommée "Personne" puis :
Le précédent programme ne définissait pour la nouvelle classe que des attributs. Dans le programme qui suit on définit non seulement des attributs mais aussi des méthodes.
Dans ce programme je vous montre que dans le cadre de chaines formatées je peux mettre entre accolades des expressions complexes telles rect1.surface(), rect1.perimetre().
Caractéristiques de rect1 : la surface est : 35 et le périmètre est : 24 Nouveaux périmètre et surface de rect1 : 45 et 28 Caractéristiques de rect2 : la surface est : 36 et le périmètre est : 24
Ce programme crée une classe nommée "Rectangle" et définit pour cette classe :
Maintenant que vous avez observé attentivement le code de ces deux programmes on peut présenter la syntaxe Python dans le cadre de la POO
Syntaxe : class Nomclasse:
Par convention le nom d’une classe commence toujours par une majuscule, mais ce n'est pas une obligation. N'oubliez pas les : pour début de bloc
Dans le même bloc il faut définir les attributs et méthodes de la classe.
def __init__(self,param1, param2, ...): self.variable1=param1 self.variable2=param2 ...
Le mot "self" est obligatoire.
__init__() est une méthode spéciale ou méthode magique ou méthode à double underscore. Voir la fin de ce chapitre.
def méthode(self): return expression
Il faut au minimum le paramètre "self". Le mot "self" sera expliqué plus loin.
L'expression est construite à partir des attributs.
Syntaxe : nomObjet = NomClasse(propriété1, propriété2, etc. )
Syntaxe : nomObjet.attribut = nouvelle valeur
Syntaxe : nomObjet.méthode()
Il faut expliquer ce que signifie ce mot "self" qui est omniprésent dans la syntaxe.
Une des particularités des méthodes est que l’objet qui l’appelle est passé comme premier argument de la fonction telle que définie dans
la classe. Ainsi, lorsqu’on écrit rect1.surface() par exemple, l’objet "rect1" est passé de manière implicite à "surface()".
Aussi une méthode possède toujours à minima le paramètre "self" et lorsqu'on appelle ladite méthode, il n'y a aucun argument à saisir.
Si la méthode __init__() comprend trois paramètres (dont self), il faut alors passer deux arguments pour créer une nouvelle instance de classe.
En POO on dit qu’un objet “hérite” des méthodes de sa classe ; cela signifie qu'une instance de classe a accès aux méthodes de cette classe.
Ainsi une instance de la classe Rectangle a accès aux méthodes surface() & perimetre().
Une classe peut "hériter" d'une autre classe : une classe dite "fille" hérite de toutes les attributs et méthodes de la classe parent.
Ici je n'utilise pas les "f-strings" dans le cadre de la fonction print() ; la syntaxe devient délicate. Donc utilisez les chaines formatées !!!
nom, âge, filière : Albert 27 math class '__main__.Etudiant'> nom, âge, filière : Isabelle 21 informatique class '__main__.Etudiant'>
Il définit dans la classe Etudiant une méthode affiche() qui produit la fiche de l'étudiant.
Si un des attributs est la date de naissance on pourrait imaginer une méthode qui calcule l'âge de l'étudiant.
Dans le cadre de la POO on peut utiliser les méthodes spéciales dites aussi méthodes magiques.
Ellles sont appelées parfois méthodes du "double underscore" car elles sont précédées et suivies toujours par deux undersocres.
La plus connue des méthodes magiques est __init()__ ; elle est incontournable et est utilisée pour créer une classe d'objets.
Utilisation de la méthode magique __init__ ().
Martin martin@free.fr <__main__.Personne object at 0x0000019159EF3CD0> >>>
La commande print(p2) retourne un message bizarre ...
Il faudrait créer une méthode magique qui se traduit par un affichage correct lorsque on exécute l'instruction print(instanceDeClasse)
Nous allons employer la méthode magique __str__()
La méthode magique __str__() est utilisée pour créer une "f-string). Ce format sera automatiquement (comme par magie) utilisé avec l'instruction print(instanceDeClasse).
Personne(Martin a pour courriel : martin@free.fr) Personne(Louis a pour courriel : louis@gmail.com) >>>
Ne confondez pas les méthodes de classe (ou d'instance) avec les méthodes spéciales.
Une méthode de classe est une méthode qui est définie dans une classe et qui peut être appelée
sur une instance (objet) de cette classe.
Une méthode spéciale est une méthode prédéfinie en Python qui est appelée automatiquement d'où l'expression méthode "magique".
Donc une méthode d'instance doit être appelée de façon explicite alors qu'une méthode magique l'est de façon implicite.
Un court exemple vaut mieux qu'un long discours !
Il faut appeler de façon explicite les méthodes d'instance (surface() & perimetre()) alors que la méthode magique __str()__ est appelée automatiquement via la fonction print().
surface rect1 : 300 surface rect2 ; 200 périmètre rect1 : 70 périmètre rect2 : 60 Propriétés de rect1 : Rectangle(longueur ; 20, largeur : 15) Propriétés de rect2 : Rectangle(longueur ; 20, largeur : 15)
La fonction print() argumentée avec une instance de classe affiche comme par magie toutes les propriétés de cet objet.