Maison >développement back-end >Tutoriel Python >Comment les classes de données sont-elles utilisées en Python ?
Python3.7 a introduit la classe de données. Le décorateur de classe de données peut déclarer une classe Python comme classe de données ; une classe de données est adaptée au stockage de données. De manière générale, elle a les caractéristiques suivantes :
Une classe de données représente un certain type de données et un objet de données représente un. type spécifique d’entité, y compris les attributs de l’entité.
Les objets du même type peuvent être comparés, par exemple supérieur à, inférieur ou égal à.
En substance, il n'y a rien de spécial dans les classes de données, c'est juste que le décorateur @dataclass génère automatiquement une série de méthodes telles que __repr__, init, __eq__, etc. Définissez la classe de données :
from dataclasses import dataclass @dataclass class A: normal: str defVal: int = 0
La forme complète de dataclass est (True consiste à générer la méthode correspondante, False ne sera pas généré ; si la méthode correspondante a été définie dans la classe, ce paramètre est ignoré) :
@dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frog=False) :
init : La méthode __init__ sera générée par défaut ; La méthode __repr__ sera générée par défaut ; repr La chaîne contient le nom de la classe, chaque nom de champ et son repr (dans l'ordre défini dans sa classe) ;
eq : La méthode __eq__ sera générée par défaut ; est transmis, la méthode __eq__ ne sera pas une classe de données ajoutée, mais héritera de l'objet.__eq__ (comparer l'identifiant) ; : S'il est False (par défaut), il est basé sur l'eq et les paramètres gelés génèrent la méthode __hash__() (utilisée par le hash() intégré).
dataclasses.field(*, default=MISSING, default_factory=MISSING, repr =True, hash=None, init=True, compare=True, metadata=None) :
init : Si vrai (par défaut), ce champ est inclus en tant que paramètre dans la méthode __init__() générée.
repr : Si vrai (par défaut), le champ est inclus dans la chaîne générée renvoyée par la méthode __repr__().
compare : Si vrai (par défaut), le champ est inclus dans les méthodes d'égalité et de comparaison générées (__eq__(), __gt__(), etc.).
hash : Peut être un booléen ou Aucun :
est Aucun (par défaut), la valeur de compare est utilisée, ce qui est généralement le comportement attendu (définir cette valeur sur autre chose que Aucun est déconseillé) ;
est vrai, alors ce champ est inclus dans la méthode __hash__() générée ;
Set hash=False but compare=True (c'est-à-dire exclure un champ du hachage, mais l'utiliser toujours à des fins de comparaison) Une possibilité possible la raison en est que calculer un hachage sur un champ coûte cher ;
métadonnées : cela peut être une carte ou None ; Cette valeur est contenue dans MappingProxyType(), ce qui la rend en lecture seule et exposée sur l'objet Field (fourni en tant que mécanisme d'extension tiers).
Utilisez default_factory pour générer des valeurs par défaut :
from dataclasses import dataclass, field import random def build_marks() -> list: return [random.randint(0, 1000) for i in range(5)] @dataclass(order=True) class RandMark: marks: list = field(default_factory=build_marks) r = RandMark() # 使用build_marks生成默认值 print(r)
Classe décorée par le décorateur dataclass :
Pas besoin de définir __init__, dataclass le gérera automatiquement
Pré-défini de manière simple ; à lire les attributs des membres (et les astuces de type) et les valeurs par défaut peuvent être définies ;
dataclass ajoutera automatiquement une fonction __repr__
dataclass
La comparaison se fait via des tuples générés par des attributs (champs) comme indiqué ci-dessus, le tuple de comparaison est (normal, defVale)
Par compare=False, vous pouvez définir des champs qui ne le sont pas. utilisé à des fins de comparaison :@dataclass(order=True) class Student: name: str = field(compare=False) score: float s = [Student("mike", 90), Student("steven", 80), Student("orange", 70) ] print(sorted(s)) # 只根据score排序
from dataclasses import dataclass @dataclass class FloatNumber: val: float decimal: float = 0 integer: float = 0 def __post_init__(self): self.decimal, self.integer = math.modf(self.val) f = FloatNumber(1.2) # decimal与integer自动赋值méthode dataclasses propriétés et méthodes intégrées des dataclasses :
fields(class_or_instance ) : renvoie un tuple d'objets de champ ;
asdict(instance, *, dict_factory=dict) : Convertit la classe de données en dictionnaire, paire (nom:valeur) ; ) : Convertissez la classe de données en tuple ;
replace(instance, **changes) : Créez un nouvel objet du même type que l'instance, et changes est la valeur à modifier.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!