Structures en Python

Vaibhav Vaibhav 10 octobre 2023
Structures en Python

Python est un langage de programmation orienté objet, ce qui signifie qu’il possède des classes et des objets. Alors que C n’est pas un langage de programmation orienté objet, ce qui signifie que l’on ne peut effectuer une programmation fonctionnelle qu’en l’utilisant. Mais C contient des structures qui sont un type de données défini par l’utilisateur.

Nous n’avons pas de structures en Python, mais nous pouvons les implémenter ou représenter leur comportement en utilisant d’autres objets, à savoir des classes de données. Une classe de données est une classe qui ne contient que des champs et des méthodes CRUD (getters et setters) pour manipuler ces champs. L’objectif principal de ces classes est de stocker des données ou de représenter certaines données sous la forme d’un package. Une classe de données représente des entités, et comme les entités ont plusieurs paramètres ou propriétés, les classes de données facilitent le regroupement de tout sous un seul objet.

Dans cet article, nous allons apprendre à utiliser les classes de données en Python.

Classe de données en Python

Python 3.7 a introduit les classes de données. Bien que les classes de données puissent être implémentées à l’aide de classes Python primitives, une classe de données implémente la plupart des fonctionnalités requises en coulisse, rendant le code Python d’une classe de données plus court et plus lisible. L’implémentation utilisant des classes Python primitives permettra plus de contrôle, mais pour les classes de données plus importantes, l’implémentation peut devenir désordonnée et massive, la rendant ingérable.

Python a un décorateur dataclass, défini dans le module dataclasses. Ce décorateur ajoute automatiquement des méthodes spéciales requises dans une classe de données telles que __init__(), __repr__(), etc.

Voici un exemple.

from dataclasses import dataclass


@dataclass
class Item:
    name: str
    price: float
    quantity: int

    def total_cost(self) -> float:
        return self.price * self.quantity

Comme mentionné ci-dessus, le décorateur @dataclass ajoute automatiquement des méthodes spéciales. Cela signifie que la méthode __init__() suivante sera ajoutée automatiquement.

def __init__(self, name: str, price: float, quantity: int = 0):
    self.name = name
    self.price = price
    self.quantity = quantity

De plus, cette classe de données peut être utilisée pour créer des objets de type Item, et ces objets peuvent être traités comme des objets de classe normaux.

from dataclasses import dataclass


@dataclass
class Item:
    name: str
    price: float
    quantity: int

    def total_cost(self):
        return self.price * self.quantity


a = Item("Chocolate", 25, 100)
b = Item("Chips", 35, 150)
c = Item("Cookie", 10, 50)
print(a)
print(b)
print(c)
print(a.total_cost())
print(b.total_cost())
print(c.total_cost())

Le décorateur dataclass a quelques paramètres, à savoir,

  • init - True par défaut. Si True, la méthode __init__() de la classe de données sera définie.
  • repr - True par défaut. Si True, la méthode __repr__() de la classe de données sera définie.
  • eq - True par défaut. Si True, la méthode __eq__() de la classe de données sera définie.
  • order - False par défaut. Si True, les méthodes __lt__(), __le__(), __gt__() et __ge__() de la classe de données seront définies.
  • unsafe_hash - False par défaut. Si False, la méthode __hash__() de la classe de données sera définie.
  • frozen - False par défaut. Si True, les attributs de la classe de données seront gelés. Cela signifie qu’une fois initialisés, ils ne peuvent plus être manipulés.
  • match_args - True par défaut.
  • kw_only - False par défaut. Si True, tous les champs de la classe de données seront marqués comme mots-clés uniquement.
  • slots - False par défaut.

Ces paramètres peuvent être configurés lors du placement d’un décorateur dataclass sur une implémentation de classe. Voici quelques exemples de la même chose.

@dataclass
class A:
    pass


@dataclass(init=True, repr=True, order=True)
class B:
    pass


@dataclass(
    eq=True,
    order=False,
    unsafe_hash=True,
)
class C:
    pass

Pour en savoir plus sur le module dataclasses, reportez-vous à la documentation officielle ici.

Vaibhav Vaibhav avatar Vaibhav Vaibhav avatar

Vaibhav is an artificial intelligence and cloud computing stan. He likes to build end-to-end full-stack web and mobile applications. Besides computer science and technology, he loves playing cricket and badminton, going on bike rides, and doodling.

Article connexe - Python Dataclass