Python Tips - A little intro to data classes
Tout les développeurs le savent, développer des types pour maintenir un invariant est souvent essentiel dans de nombreux projets. Avec le C ou le C++ on peut facilement utiliser des structures pour cela.
En python, on utilise souvent des objets pour cela et le code nécéssaire pour les implémenter peut être assez long si on veut un minimum de fonctionalités.
Par exemple :
class Card():
def __init__(self, rank, suit):
self.__rank = ''
self.__suit = ''
self.rank = rank
self.suit = suit
def __repr__(self):
return (f'{self.__class__.__name__}'
f'(rank={self.rank!r}, suit={self.suit!r})')
def __eq__(self, other):
if other.__class__ is not self.__class__:
return NotImplemented
@property
def rank(self):
return self.__rank
@rank.setter
def rank(self, new_rank):
if not type(new_rank) is str:
raise TypeError
else:
self.__rank = new_rank
@property
def suit(self):
return self.__suit
@suit.setter
def suit(self, new_suit):
if not type(new_suit) is str:
raise TypeError
else:
self.__suit = new_suit
Vous en conviendrez sûrement, définir tout ceci prend du temps et n'est pas très lisible.
Depuis Python 3.7 il existe une fonctionalité qui va vous changer la vie : les dataclasses.
On va importer le décorateur dataclass
depuis le module dataclasses
:
from dataclasses import dataclass
On définit ensuite notre type:
@dataclass
class DataClassCard:
rank: str
suit: str
Les fonctions __obj__
et __repr__
sont déjà intégrée, ce qui nous fait gagner du temps.
On a bien ensuite le même fonctionnement à part pour la protection contre un mauvais typage des attributs à la conception:
>>>card = Card('Q', 'Heart')
>>>new_card = DataClassCard('Q', 'Heart')
>>>print(card, new_card)
Card(rank='Q', suit='Heart') DataClassCard(rank='Q', suit='Heart')
>>>print(new_card.suit)
Heart
>>>new_card = DataClassCard(1,1)
>>>print(card, new_card)
Card(rank='Q', suit='Heart') DataClassCard(rank=1, suit=1)
"Mais alors comment on fait pour créer des dataclasses avec des attributs immutables ? "
TADAAAA ! facile non ?
@dataclass(frozen = True)
class DataClassCard:
rank: str
suit: str
On spécifie l'argument booléen frozen
et voilà !
"Mais si je veux des valeurs par défault ça se passe comment ? "
C'est relativement simple vous allez voir.
Il faut utiliser la syntaxe suivante :
@dataclass
class DataClassCard:
rank: str = 'A'
suit: str = 'Spade'
Vous pourrez retrouver une bonne partie des articles de ce compte ici.
Pour accéder directement la section que vous regardez actuellement cliquer ici.
Vous êtes arrivé à la fin, bravo! Si vous avez des questions, n'oubliez pas de les poser. A la prochaine !
800 PLANET! You have been rewarded with a 80% vote. Your action makes this project grow and helps to restore a Clean Planet! Join us on our Discord Channel and on our websiteThanks to @theophile.roos for burning
@zuerich Thank you for your upvotes!
You're welcome.
I like to read French (quite underrepresented here on Hive), and I am starting to learn Python.
well if you want to read more french content, there is a community supporting this : https://peakd.com/c/hive-196396/created