đĄ Python & la POO#
Orienté objet
Les langage de programmation orientĂ© objet implĂ©mentent le paradigme de programmation orientĂ©e objet (POO). Ce paradigme consiste en la rĂ©union des donnĂ©es et des traitements associĂ©es Ă ces donnĂ©es au sein dâentitĂ©s cohĂ©rentes appelĂ©es objets.
Indication
Une introduction plus générale sur la programmation orientée object est disponible ici : 𧩠OOP
Langages Ă classes ou Ă prototypes#
LĂ oĂč les choses se compliquent, câest que tous les langages objets ne permettent pas de crĂ©er et manipuler des classes.
En effet, il existe deux types de langages objet :
Les langages objets Ă classes
Les langages objets Ă prototypes
Les langages objets Ă prototypes (comme par exemple Javascript) ne permettent pas nativement de crĂ©er des classes, mĂȘme sâil manipulent des objets. Les objets y sont créés suivant un prototype (un autre objet) plutĂŽt que par instanciation dâune classe.
Python est un langage orienté objet qui a deux caractéristiques importantes :
Il sâagit dâun langage Ă classes, son approche orientĂ©e objet est dite « traditionnelle », elle sâapparente de celle de
C++, en diffĂ©renciant les concepts de classe et dâobjet.Le dĂ©veloppeur nâest pas obligĂ© dâemployer une approche objet quand il Ă©crit du code Python.
Important
Python est « multi-paradigme », câest Ă dire quâil autorise plusieurs façon de dĂ©velopper et de concevoir ses programmes. Lâune dâentre elle est la programmation orientĂ©e object, bien que Python nâimpose pas de coder en OOP son fonctionnement interne est fortement teintĂ© dâobjet.
Tout est un object#
En python, tout est un object, il suffit dâexĂ©cuter ce script pour sâen rendre compte:
print(type(42))
print(type("HelloWorld"))
print(type([]))
print(type(()))
print(type({}))
def func(var):
print(var)
print(type(func))
et nous obtiendrons cette sortie:
<class 'int'>
<class 'str'>
<class 'list'>
<class 'tuple'>
<class 'dict'>
<class 'function'>
Ces Ă©lĂ©ments sont tous de types diffĂ©rent mais ont un point en commun le terme class. A lâinstar de lâinstruction def qui dĂ©finit une fonction, class dĂ©finit une classe dâobject python.
Définir ses propres objets#
Nous allons traduire la classe définit au format UML
Diagramme UML de notre classe dinosaure#
class Dinosaur(object):
def __init__(self, name: str):
self.name = name
def whoami(self) -> str:
return f"I'm {self.name}"
Quelques remarques:
le mot clé
classdĂ©finit notre classe dâobject, par convention son nom commence par une majuscule.notre classe dĂ©finit deux mĂ©thodes.
__init__est lâinitialisateur de notre classe et permet de dĂ©finir les attributs de notre instance.
Important
Toute mĂ©thode dâinstance doit prendre en premier paramĂštre la rĂ©fĂ©rence vers lâinstance via le mot clĂ© self
Classe et instance#
Une classe est un « blueprint » qui nous permet de crĂ©er des objet, elle dĂ©finit ses attributs et mĂ©thodes. Pour crĂ©er une instance il faut lâinstancier:
rexy = Dinosaur('Rexy')
clever_girl = Dinosaur('Clever Girl')
print(type(rexy))
print(type(clever_girl))
Nous avons crĂ©er deux instances de notre classe Dinosaur, celles-ci sont autonomes, il sâagit de deux object bien distincts.
Attributs#
Un attribut est une donnĂ©e associĂ© Ă un object, celui-ci peut contenir nâimporte quel object python.
print(rexy.name)
print(clever_girl.name)
clever_girl.name = 'The Big One'
print(clever_girl.name)
clever_girl.specie = 'Velociraptor'
print(clever_girl.specie)
Important
Tous les attributs et méthodes des classes Python sont « publics » au sens de C++.
We are all consenting adults
âGuido van Rossum, (CrĂ©ateur de Python).
La convention de prĂ©fixer un attribut et/ou une mĂ©thode par _ indique quâil sâagit dâun attribut interne et dâĂ©viter de lâutiliser.
Méthodes#
Une mĂ©hode est une « fonction associĂ© Ă un object », elle peut utiliser ses attributs, les modifier et faire appels Ă dâautres mĂ©thodes de lâobject.
Attention
Toutes les mĂ©thodes prennent une variable self (sauf les mĂ©thodes de classe) comme premier argument. Cette variable est une rĂ©fĂ©rence Ă lâobjet manipulĂ©.
print(rexy.whoami())
Indication
On ne spĂ©cifie pas le paramĂštre self lorsque lâon manipule une instance. Le lien entre lâinstance et la mĂ©thode est dĂ©jĂ fait.
La méthode __init__#
La mĂ©thode __init__ est comme son nom lâindique un initialisateur, lâinstance de notre classe est dĂ©jĂ crĂ©er Ă ce moment lĂ .
En Python, on nâest pas tenu de dĂ©clarer tous les attributs de la classe comme dans dâautres langages : on peut se contenter de les initialiser au sein de la mĂ©thode __init__ !
Héritage#
Python supporte lâhĂ©ritage simple et lâhĂ©ritage multiple. La crĂ©ation dâune classe fille est relativement simple, il suffit de prĂ©ciser entre parenthĂšses le nom de la classe mĂšre lors de la dĂ©claration de sa fille.
class Sauropod(Dinosaur):
def __init__(self, name):
super(Sauropod, self).__init__(**kwargs)
self.family = "Sauropod"
Note
Un Ă©lĂ©ment important Ă remarquer est lâutilisation de la fonction super(), elle permet, de maniĂšre « intelligente », de dĂ©lĂ©guer Ă la ou les classe(s) mĂšre(s) lâexĂ©cution de certains traitements.
On lâutilise donc notamment pour appeler, depuis une classe fille, le constructeur de la classe mĂšre.
La mĂ©thode super() utilise lâalgorithme du MRO (Method Resolution Order) pour parcourir lâarbre des hĂ©ritages.