đĄ 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é
class
dĂ©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.