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. SiTrue
, la méthode__init__()
de la classe de données sera définie.repr
-True
par défaut. SiTrue
, la méthode__repr__()
de la classe de données sera définie.eq
-True
par défaut. SiTrue
, la méthode__eq__()
de la classe de données sera définie.order
-False
par défaut. SiTrue
, les méthodes__lt__()
,__le__()
,__gt__()
et__ge__()
de la classe de données seront définies.unsafe_hash
-False
par défaut. SiFalse
, la méthode__hash__()
de la classe de données sera définie.frozen
-False
par défaut. SiTrue
, 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. SiTrue
, 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.