Les Classes

À mesure que les programmes grandissent en taille et en complexité, gérer et organiser le code peut devenir un véritable défi. Les fonctions et les variables peuvent être dispersées dans différentes parties du programme, rendant difficile le suivi de ce qui se passe et conduisant à un code désordonné et difficile à maintenir. C'est là que les classes, une pierre angulaire de la programmation orientée objet, entrent en jeu.
💡
Les classes sont un moyen de regrouper des données et des fonctions, créant ce que nous appelons des « objets ». Les classes sont des concepts fondamentaux en programmation orientée objet (POO).
Les classes sont comme des plans pour créer des objets dans notre code. Chaque classe regroupe des propriétés (données) et des méthodes (fonctions) connexes en unités uniques. Par exemple, dans un programme de jeu, vous pourriez avoir des classes comme Player, Monster ou Item, chacune contenant ses propres données et méthodes pertinentes. Cela facilite la compréhension et la gestion de grandes bases de code, car les fonctionnalités connexes sont groupées, et il devient clair comment elles interagissent entre elles.
Supposons que vous vouliez créer un logiciel pour modéliser une bibliothèque. Vous avez peut-être des livres dans votre bibliothèque, donc vous devrez créer une classe Book :
class Book:
    def __init__(self, title, author, pages):
        self.title = title     # Assigne le titre à l'instance du livre
        self.author = author   # Assigne l'auteur à l'instance du livre
        self.pages = pages     # Assigne le nombre de pages à l'instance du livre
Le mot-clé class introduit une nouvelle classe, suivi de son nom (Book). La ligne def __init__(self, title, author, pages): définit l'état initial de la classe ou le constructeur. C'est là que l'objet est initialisé. self fait référence à l'instance de la classe. title, author et pages sont des attributs de la classe.
Vous pouvez créer un nouvel objet livre en appelant la classe comme une fonction :
# Crée une nouvelle instance de Book
mockingbird = Book('To Kill a Mockingbird', 'Harper Lee', 281)

print(mockingbird.title)   # To Kill a Mockingbird
print(mockingbird.author)  # Harper Lee
print(mockingbird.pages)   # 281
Remarquez que nous passons To Kill a Mockingbird, Harper Lee et 281 comme arguments. Ceux-ci sont passés en arguments à la méthode __init__ (presque comme une fonction ordinaire).
Nous pouvons créer plusieurs instances de la classe Book :
# Crée d'autres instances de Book
book2 = Book('1984', 'George Orwell', 328)
book3 = Book('The Great Gatsby', author='F. Scott Fitzgerald', pages=180)
book4 = Book('Moby Dick', 'Herman Melville', pages=720)

# Affiche quelques informations sur les livres
print(f'{book2.title} by {book2.author} has {book2.pages} pages.')  # 1984 by George Orwell has 328 pages.
print(f'{book3.title} by {book3.author} has {book3.pages} pages.')  # The Great Gatsby by F. Scott Fitzgerald has 180 pages.
print(f'{book4.title} by {book4.author} has {book4.pages} pages.')  # Moby Dick by Herman Melville has 720 pages.
Comme pour les fonctions, nous pouvons passer à la méthode __init__ des arguments positionnels ou nommés.
En plus des données, les classes peuvent également encapsuler des fonctionnalités. Supposons que, dans notre système de bibliothèque, nous voulions marquer un livre comme lu. Nous pouvons définir une méthode dans notre classe Book pour cet objectif :
class Book:
    def __init__(self, title, author, pages):
        self.title = title     # Assigne le titre à l'instance du livre
        self.author = author   # Assigne l'auteur à l'instance du livre
        self.pages = pages     # Assigne le nombre de pages à l'instance du livre
        self.is_read = False   # Le livre n'a pas encore été lu

    def mark_as_read(self):    # Une méthode de classe
        self.is_read = True    # Marque le livre comme lu


mockingbird = Book('To Kill a Mockingbird', 'Harper Lee', 281)
print(mockingbird.is_read)   # False, le livre n'a pas encore été lu
mockingbird.mark_as_read()   # Marque le livre comme lu
print(mockingbird.is_read)   # True, le livre a été lu
La méthode mark_as_read change l'état de l'attribut is_read à True. Nous pouvons appeler cette méthode sur n'importe quelle instance de livre. Cela montre comment nous pouvons regrouper des données et des fonctionnalités liées en utilisant des classes en Python.
💡
En Python, self est un nom conventionnel pour le premier paramètre dans les méthodes d'instance d'une classe. Il s'agit d'une référence à l'instance actuelle de la classe. self est utilisé pour accéder aux attributs et aux méthodes de la classe à l'intérieur de sa définition. Lorsque vous créez un nouvel objet de la classe, Python associe automatiquement l'argument self à ce nouvel objet, c'est pourquoi vous ne passez pas self lorsque vous appelez une méthode d'instance. Bien que self ne soit pas un mot-clé réservé en Python, il est largement utilisé en raison du style clair et lisible qu'il encourage. Il est important de noter que vous pourriez utiliser un autre nom, mais l'utilisation de self est fortement recommandée par la communauté et est considérée comme une bonne pratique.

Défi : Créer une classe Car

Vous êtes chargé de créer une classe Car qui doit avoir les attributs suivants :
  • color (la couleur de la voiture)
  • make (la marque de la voiture)
  • model (le modèle spécifique de la voiture)
  • year (l'année de fabrication)
Ces attributs doivent être initialisés dans la méthode __init__ de la classe.
De plus, la classe Car doit avoir une méthode display_details. Cette méthode doit renvoyer une représentation sous forme de chaîne des détails de la voiture au format [year] [color] [make] [model].
Input
Output
c = Car('red', 'Ferrari', 'F8', 2023); print(c.display_details())
2023 red Ferrari F8
c = Car('black', 'Tesla', 'Model S', 2021); print(c.display_details())
2021 black Tesla Model S
 

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue