Implémentez la programmation orientée objet en Python

Dans les chapitres précédents, vous avez écrit du code Python avec des variables, des conditions, des boucles et des fonctions. Dans ce chapitre, vous allez voir comment Python permet d'organiser ces éléments autour d'objets. L'objectif est de comprendre la structure la plus fréquente d'un code Python orienté objet : une classe qui décrit un type d'élément, puis des objets créés à partir de cette classe.

Vous allez continuer avec un exemple de produit. Un produit peut avoir un nom, un prix et un stock. Au lieu de manipuler ces informations séparément dans un dictionnaire, vous allez apprendre à les regrouper dans une classeProduct.

Créez une classe pour représenter une information

Une classe sert à décrire une forme d'objet. Elle indique quelles informations l'objet peut contenir et quelles actions il peut proposer. En Python, on définit une classe avec le mot-cléclass:

class Product:
    pass

Cette classe ne contient encore rien : le mot-clépasssert de « placeholder » pour indiquer un bloc vide. Vous allez la remplir dans les sections suivantes.

Créez un objet à partir d'une classe

Une fois la classe écrite, vous pouvez créer un objet — on parle d'instancier la classe :

class Product:
    pass


product = Product()
product.name = "Sac à dos"
product.price = 45.90
product.stock = 12

print(product.name)

La ligne suivante crée un nouvel objetProduct:

product = Product()

Vous pouvez la lire ainsi : crée un objet de typeProduct, puis garde cet objet dans une variable appeléeproduct.

Les lignes suivantes attachent des informations à cet objet :

product.name = "Sac à dos"
product.price = 45.90
product.stock = 12

Le point.permet d'accéder à un élément de l'objet. Ici,product.namedésigne l'attributnamede l'objetproduct.

Quand le programme afficheprint(product.name), la console affiche :

Sac à dos

Cette écriture fonctionne, mais elle est fragile : rien ne garantit qu'unProductaura toujours unname, unpriceet unstock. Si vous essayez d'accéder à un attribut qui n'a pas été défini, Python lève une erreurAttributeError:

backpack = Product()
backpack.name = "Sac à dos"
print(backpack.price)
AttributeError: 'Product' object has no attribute 'price'

Pour rendre l'objet cohérent dès sa création et éviter ce genre d'erreur, on utilise un constructeur.

Initialisez un objet avec__init__

En Python, le constructeur d'une classe s'appelle__init__(avec deux underscores de chaque côté). C'est une méthode spéciale que Python appelle automatiquement quand vous créez un objet.

class Product:
    def __init__(self, name, price, stock):
        self.name = name
        self.price = price
        self.stock = stock


product = Product("Sac à dos", 45.90, 12)
print(product.name)

Commencez par observer le résultat attendu :

Sac à dos

Pour comprendre comment Python arrive à ce résultat, partez de la ligne qui crée le produit :

product = Product("Sac à dos", 45.90, 12)

Cette ligne crée un objet de typeProductet le garde dans une variable appeléeproduct. Les valeurs"Sac à dos",45.90et12sont données au moment de la création.

Ces valeurs sont reçues par la méthode__init__:

def __init__(self, name, price, stock):
    self.name = name
    self.price = price
    self.stock = stock

Son rôle est d'initialiser l'objet, c'est-à-dire de remplir ses attributs avec des valeurs de départ.

Le premier paramètre s'appelleselfpar convention. Il représente l'objet en cours de création. À l'intérieur du constructeur :

  • self.name = nameplace la valeur reçue"Sac à dos"dans l'attributnamede l'objet ;

  • self.price = priceplace45.90dans l'attributprice;

  • self.stock = stockplace12dans l'attributstock.

Ajoutez une méthode dans une classe

Une classe ne sert pas seulement à stocker des informations. Elle peut aussi contenir des méthodes liées à ces informations. Une méthode est simplement une fonction définie à l'intérieur d'une classe, dont le premier paramètre estself.

class Product:
    def __init__(self, name, price, stock):
        self.name = name
        self.price = price
        self.stock = stock

    def is_available(self):
        return self.stock > 0

La méthodeis_availableutilise l'attributself.stockde l'objet. Si le stock est supérieur à0, elle retourneTrue. Sinon, elle retourneFalse.

Vous pouvez appeler cette méthode sur un objet :

product = Product("Sac à dos", 45.90, 12)
print(product.is_available())

La console affiche :

True

La ligne suivante appelle la méthodeis_availablesur l'objetproduct:

product.is_available()

Notez que vous ne passez pas self à l'appel : Python le fournit automatiquement à partir de l'objet à gauche du point.

Découvrez la convention de l'underscore

Dans les exemples précédents, les attributs sont accessibles directement avecproduct.nameouproduct.stock. Pour un premier exemple, cela permet de comprendre facilement le lien entre objet et attribut.

Dans un code Python plus organisé, vous pouvez aussi rencontrer des attributs dont le nom commence par un underscore_, comme_stock. Cette écriture est une convention : elle signale aux autres développeurs que l'attribut relève de l'implémentation interne de la classe et qu'il ne fait pas partie de son interface publique.

class Product:
    def __init__(self, name, price, stock):
        self._name = name
        self._price = price
        self._stock = stock

    def is_available(self):
        return self._stock > 0

    def get_name(self):
        return self._name

Le_devantname,priceetstockenvoie ce signal : « cet attribut est interne à la classe ». Attention : c'est bien une convention, pas une protection technique. Contrairement à Java oùprivateempêche l'accès depuis l'extérieur, en Pythonproduct._namereste parfaitement accessible — l'interpréteur ne lève aucune erreur. L'underscore fonctionne comme un panneau « ne pas déranger » adressé aux autres développeurs qui liront le code.

Vous pouvez ensuite lire une information via une méthode dédiée :

product = Product("Sac à dos", 45.90, 12)
print(product.get_name())

Utilisez plusieurs objets

Une fois que vous savez créer un objet, vous pouvez en créer plusieurs à partir de la même classe. Chaque objet a ses propres valeurs :

backpack = Product("Sac à dos", 45.90, 12)
notebook = Product("Carnet", 4.50, 0)

print(backpack.get_name())
print(notebook.get_name())

La classeProductdécrit une structure commune. Les objetsbackpacketnotebooksont deux produits différents. Ils ont le même type, mais pas les mêmes valeurs.

Vous pouvez aussi placer plusieurs objets dans une liste :

products = [
    Product("Sac à dos", 45.90, 12),
    Product("Carnet", 4.50, 0),
]

for product in products:
    print(product.get_name())

La boucle parcourt les produits un par un, puis affiche leur nom.

Aller plus loin : dataclasses et évolutions du typing

Python propose aussi une syntaxe plus courte pour représenter certaines données simples : lesdataclass. Unedataclassgénère automatiquement__init__et quelques autres méthodes utiles à partir des annotations de type.

from dataclasses import dataclass


@dataclass
class Product:
    name: str
    price: float
    stock: int

Cette syntaxe peut être pratique pour des objets simples qui contiennent surtout des données. Elle s'appuie sur les annotations de type (nom: str,prix: float, etc.), que Python permet d'utiliser dans tout le code pour rendre les intentions plus explicites. Les annotations elles-mêmes n'ont rien de spécifique auxdataclass: on peut annoter les attributs d'une classe classique de la même manière.

À vous de jouer

Votre équipe veut représenter chaque plat de l’application par un objet, avec ses informations (nom, prix, disponibilité) et sa propre façon de se décrire. Voici le squelette à compléter :

class Dish:
    # Étape 1 : écrivez le constructeur __init__(self, name, price, available)
    #           avec 3 attributs : self.name, self.price, self.available

    # Étape 2 : écrivez la méthode describe(self) qui retourne un str
    pass


# Étape 3 : créez 2 objets Dish et affichez leur description

Votre mission :

  1. Complétez la classeDish: constructeur__init__(self, name, price, available)qui range les valeurs dansself.name,self.price,self.available. Vous pouvez retirer lepassune fois les méthodes écrites.

  2. Ajoutez une méthodedescribe(self)qui retourne unstrau formatPizza (12.0 €) - disponible(ou- indisponiblesiself._availablevautFalse).

  3. Créez deux plats : unePizzaà12.0 €disponible, unTiramisuà6.0 €indisponible. Appelezdescribe()sur chacun et affichez le résultat avecprint.

En résumé

  • Une classe décrit une structure ; un objet est un élément concret créé à partir de cette structure.

  • Les attributs stockent les informations d'un objet, comme un nom, un prix ou un stock.

  • __init__est une méthode spéciale appelée automatiquement à la création d'un objet ; on l'utilise notamment pour recevoir des valeurs et les ranger dans les attributs de l'objet.

  • Une méthode est une fonction définie dans une classe ; le paramètreselfy désigne l'objet lui-même et permet d'accéder à ses attributs.

  • En Python, un underscore_en début de nom signale aux autres développeurs qu'un attribut est interne ; ce signal relève d'une convention, pas d'une protection appliquée par l'interpréteur.

Vous savez maintenant organiser des informations et des comportements simples dans des classes Python. Dans le dernier chapitre, vous allez lire une structure de code existante, manipuler des données dans un fichier et gérer des erreurs simples.

Et si vous obteniez un diplôme OpenClassrooms ?
  • Formations jusqu’à 100 % financées
  • Date de début flexible
  • Projets professionnalisants
  • Mentorat individuel
Trouvez la formation et le financement faits pour vous