Python Tips 2 - A little intro to data classes

in STEMGeeks4 years ago

Python Tips - A little intro to data classes

from me

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 !

Sort:  

Thanks to @theophile.roos for burning 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 website

@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