La Programmation Orientée Objet (souvent abrégé POO) est un paradigme de programmation (une façon de programmer) que vous utilisez sans le savoir à chaque fois que vous écrivez un programme en Python.
En effet, en Python, tout est objet: listes, dictionnaires, chaînes de caractères... et même les entiers !
Un objet est une structure de données que l'on manipule grâce à des méthodes qui lui sont propres.
Par exemple, pour ajouter un élément dans une liste, on utilise la méthode
>>> liste = [1,2,3,4]
>>> liste.append(5)
>>> liste
[1,2,3,4,5]
>>> liste.pop()
5
>>> liste
[1,2,3,4]
Dans le code ci-dessus,
En ce sens, un objet est semblable à une boîte noire composée d'une structure interne complexe mais dont la compréhension du fonctionnement n'est pas forcément nécessaire au programmeur, qui se contente d’utiliser les méthodes disponibles pour cet objet.

Une photocopieuse est un objet : elle possède une méthode
Jusqu'à maintenant, nous nous sommes contentés de créer et de manipuler des objets comme des listes, des dictionnaires. Il est temps d'apprendre à concevoir des objets.
Pour concevoir un objet, il faut écrire la classe correspondante. La classe est en quelque sorte le moule qui va servir à fabriquer notre objet, c'est un plan de construction, un modèle. Cependant, les objets créées avec une même classe ne sont pas identiques. Ils présentent des caractéristiques et des fonctions communes mais peuvent différer sur certains points.

Trois objets issus d'une même classe
Pour définir une classe en Python, on utilise le mot-clé
class NomDeLaClasse:
# Implémentation de la classe
Imaginons la situation suivante : vous développez un RPG et on vous demande d'implémenter une classe

Un exemple pour la classe
Commençons par définir quelques attributs. Pour notre classe
class Personnage:
""" Définition d'une classe Personnage
Un personnage est défini par :
- son nom
- son nombre de points de vie
- le nom de son arme
- les points de dégats de son arme """
""" Constructeur de la classe Personnage """
def __init__(self, nom, pv, nom_arme, degats_arme):
self.nom = nom
self.pv = pv
self.nom_arme = nom_arme
self.degats_arme = degats_arme
Il ne nous reste plus qu'à créer des objets de type
class Personnage:
""" Définition d'une classe Personnage
Un personnage est défini par :
- son nom
- son nombre de points de vie
- le nom de son arme
- les points de dégats de son arme """
""" Constructeur de la classe Personnage """
def __init__(self, nom, pv, nom_arme, degats_arme):
self.nom = nom
self.pv = pv
self.nom_arme = nom_arme
self.degats_arme = degats_arme
frodon = Personnage("Frodon Sacquet", 150, "Dard", 20)
gollum = Personnage("Gollum", 100, "Poings", 10)
Dans l'exemple ci-dessus, on crée deux objets (appelés instances de classe), chacun ayant ses propres caractéristiques. On peut accéder aux attributs de nos objets en écrivant
>>> frodon.nom
'Frodon Sacquet'
>>> frodon.pv
150
>>> gollum.nom_arme
'Poings'
Bien entendu, un objet ne se limite pas à une liste d'attributs. Tout l'intérêt de la POO réside dans la définition de méthodes propres à nos objets. Une méthode est une fonction qui va agir directement sur notre objet.
Nos personnages peuvent par exemple se soigner en buvant une potion, ou changer l'arme qu'ils portent.
On définit ces fonctions dans la classe
class Personnage:
""" Définition d'une classe Personnage
Un personnage est défini par :
- son nom
- son nombre de points de vie
- le nom de son arme
- les points de dégats de son arme """
""" Constructeur de la classe Personnage """
def __init__(self, nom, pv, nom_arme, degats_arme):
self.nom = nom
self.pv = pv
self.nom_arme = nom_arme
self.degats_arme = degats_arme
""" Augmente le nombre de points de vie du personnage d'une quantité donnée """
def boire_potion(self, quantite):
self.pv += quantite
print(f"{self.nom} récupère {quantite} points de vie.")
""" Modifie le nom et les dégâts de l'arme portée par le personnage """
def changer_arme(self, nom_nouvelle_arme, degats_nouvelle_arme):
self.nom_arme = nom_nouvelle_arme
self.degats_arme = degats_nouvelle_arme
print(f"{self.nom} change d'arme pour : {self.nom_arme}")
frodon = Personnage("Frodon Sacquet", 150, "Dard", 20)
gollum = Personnage("Gollum", 100, "Poings", 10)
>>> gollum.boire_potion(20)
Gollum récupère 20 points de vie
>>> gollum.pv
120
>>> frodon.changer_arme("Excalibur", 300)
Frodon change d’arme pour : Excalibur
>>> frodon.nom_arme
'Excalibur'
>>> frodon.degats_arme
300
Il est temps de faire combattre nos personnages en implémentant une méthode
class Personnage:
# Seule la méthode attaquer est représentée
""" Attaque d'un autre personnage : on diminue ses PV """
def attaquer(self, adversaire):
adversaire.pv -= self.degats_arme
print(f"{adversaire.nom} reçoit {self.degats_arme} points de dégâts.")
>>> frodon.attaquer(gollum)
Gollum reçoit 20 points de dégâts.
>>> gollum.attaquer(frodon)
Frodon reçoit 10 points de dégâts.
Codée ainsi, la méthode
class Personnage:
# Seule les méthodes attaquer et recevoir_degats sont représentées
""" Attaque d'un autre personnage : l'adversaire reçoit des dégâts """
def attaquer(self, adversaire):
adversaire.recevoir_degats(self.degats_arme)
""" Réception des dégâts """
def recevoir_degats(self, degats):
self.pv -= degats
print(f"{self.nom} reçoit {degats} points de dégâts.")