Avec PEP 557, les classes de données sont introduites dans la bibliothèque standard python.
Ils utilisent le @dataclass
décorateur et ils sont supposés être des "tuples nommés mutables avec défaut" mais je ne suis pas vraiment sûr de comprendre ce que cela signifie réellement et en quoi ils sont différents des classes courantes.
Que sont exactement les classes de données Python et quand est-il préférable de les utiliser?
python
class
python-3.7
python-dataclasses
roiJulian
la source
la source
namedtuple
s sont immuables et ne peuvent pas avoir de valeurs par défaut pour les attributs, alors que les classes de données sont modifiables et peuvent les avoir.@dataclass
ne provoquera pas la désintégration du site.namedtuples
PEUT avoir des valeurs par défaut. Regardez ici: stackoverflow.com/questions/11351032/…Réponses:
Les classes de données ne sont que des classes régulières orientées vers le stockage de l'état, plus que contenant beaucoup de logique. Chaque fois que vous créez une classe composée principalement d'attributs, vous créez une classe de données.
Le
dataclasses
module facilite la création de classes de données. Il s'occupe de beaucoup de plaques chauffantes pour vous.Ceci est particulièrement important lorsque votre classe de données doit être hachable; cela nécessite une
__hash__
méthode aussi bien qu'une__eq__
méthode. Si vous ajoutez une__repr__
méthode personnalisée pour faciliter le débogage, cela peut devenir assez détaillé:Avec
dataclasses
vous pouvez le réduire à:Le même décorateur de classe peut également générer des méthodes de comparaison (
__lt__
,__gt__
, etc.) et la poignée immuabilité.namedtuple
les classes sont également des classes de données, mais sont immuables par défaut (en plus d'être des séquences).dataclasses
sont beaucoup plus flexibles à cet égard et peuvent facilement être structurés de manière à pouvoir remplir le même rôle qu'unenamedtuple
classe .Le PEP s'est inspiré du
attrs
projet , qui peut faire encore plus (y compris les slots, les validateurs, les convertisseurs, les métadonnées, etc.).Si vous voulez voir quelques exemples, j'ai récemment utilisé
dataclasses
pour plusieurs de mes solutions Advent of Code , voir les solutions pour les jours 7 , 8 , 11 et 20 .Si vous souhaitez utiliser le
dataclasses
module dans les versions Python <3.7, vous pouvez installer le module rétroporté (nécessite 3.6) ou utiliser leattrs
projet mentionné ci-dessus.la source
@dataclass
génère à peu près la même__init__
méthode, avec unquantity_on_hand
argument mot - clé avec la valeur par défaut. Lorsque vous créez une instance, il définira toujours l'quantity_on_hand
attribut d'instance. Donc, mon premier exemple non-dataclass utilise le même modèle pour faire écho à ce que le code généré par dataclass fera.__post_init__
méthode.Aperçu
La question a été abordée. Cependant, cette réponse ajoute quelques exemples pratiques pour aider à la compréhension de base des classes de données.
namedtuple
et autres .Voici ce que signifie cette dernière phrase:
namedtuple
classe ou une classe normale.Par rapport aux classes courantes, vous économisez principalement sur la saisie de code standard.
Caractéristiques
Ceci est un aperçu des fonctionnalités de la classe de données (TL; DR? Voir le tableau récapitulatif dans la section suivante).
Ce que vous obtenez
Voici les fonctionnalités que vous obtenez par défaut à partir des classes de données.
Attributs + représentation + comparaison
Ces valeurs par défaut sont fournies en définissant automatiquement les mots-clés suivants sur
True
:Ce que vous pouvez activer
Des fonctionnalités supplémentaires sont disponibles si les mots-clés appropriés sont définis sur
True
.Ordre
Les méthodes de classement sont maintenant implémentées (opérateurs de surcharge:)
< > <= >=
, de la même manièrefunctools.total_ordering
qu'avec des tests d'égalité plus forts.Hashable, Mutable
Bien que l'objet soit potentiellement mutable (éventuellement indésirable), un hachage est implémenté.
Hashable, immuable
Un hachage est maintenant implémenté et la modification de l'objet ou l'attribution d'attributs est interdite.
Dans l'ensemble, l'objet peut être haché si l'un
unsafe_hash=True
ou l' autrefrozen=True
.Voir également la table logique de hachage d' origine avec plus de détails.
Ce que tu n'obtiens pas
Pour obtenir les fonctionnalités suivantes, des méthodes spéciales doivent être implémentées manuellement:
Déballage
Optimisation
La taille de l'objet est maintenant réduite:
Dans certaines circonstances,
__slots__
améliore également la vitesse de création des instances et d'accès aux attributs. De plus, les emplacements n'autorisent pas les attributions par défaut; sinon, aValueError
est levé.En savoir plus sur les machines à sous dans cet article de blog .
Sommaire
+ Ces méthodes ne sont pas générées automatiquement et nécessitent une implémentation manuelle dans une classe de données.
*
__ne__
n'est pas nécessaire et n'est donc pas implémenté .Caractéristiques supplémentaires
Post-initialisation
Héritage
Les conversions
Convertissez une classe de données en tuple ou en dict, de manière récursive :
Limites
Références
la source
De la spécification PEP :
Le
@dataclass
générateur ajoute des méthodes à la classe que vous auriez autrement vous définissez comme__repr__
,__init__
,__lt__
et__gt__
.la source
Considérez cette classe simple
Foo
Voici la
dir()
comparaison intégrée. Sur le côté gauche se trouve leFoo
décorateur sans @dataclass, et à droite avec le décorateur @dataclass.Voici un autre diff, après avoir utilisé le
inspect
module pour comparaison.la source