Maison >développement back-end >Tutoriel Python >Comment les classes de données sont-elles utilisées en Python ?

Comment les classes de données sont-elles utilisées en Python ?

WBOY
WBOYavant
2023-04-23 17:22:071496parcourir

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 à.

Définition de classe de données

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

Decorator

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é).

  • Si eq et gelé sont tous deux vrais, une méthode __hash__() sera générée par défaut ;
  • Si eq est vrai et gelé est faux, __hash__() sera défini sur Aucun, en le définissant comme Marqué comme unhashable (ce qui est le cas, puisqu'il est mutable) ;
  • Si eq est faux, __hash__() restera inchangé, ce qui signifie que la méthode __hash__() de la superclasse sera utilisée (si la superclasse est un objet, revenez à id -hachage basé sur).
    • frozen : Si vrai, les attributs ne peuvent pas être modifiés après l'initialisation de l'instance ;
    • field
    • Grâce à la méthode field, les attributs peuvent être personnalisés :

      dataclasses.field(*, default=MISSING, default_factory=MISSING, repr =True, hash=None, init=True, compare=True, metadata=None) :

  • default : Si fourni, ce sera la valeur par défaut pour ce champ.

default_factory : utilisé pour spécifier des champs avec des valeurs par défaut variables. Il doit s'agir d'un objet appelable sans paramètres mutuellement exclusifs (ne peut pas être spécifié en même temps).


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)
  • Initialisez
  • 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

  • peut automatiquement ajouter des méthodes de comparaison via @dataclass( order = True) ( ​​__eq__ et __lt__) :
  • 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排序
  • Post-traitement

    Le post-traitement peut être effectué via __post_init__ (appelé automatiquement avant le retour de __init__) :
  • 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer