Heim  >  Artikel  >  Backend-Entwicklung  >  Wie werden Datenklassen in Python verwendet?

Wie werden Datenklassen in Python verwendet?

WBOY
WBOYnach vorne
2023-04-23 17:22:071460Durchsuche

Python3.7 hat die Datenklasse eingeführt. Der Datenklassendekorator kann eine Python-Klasse als Datenklasse deklarieren; eine Datenklasse ist zum Speichern von Daten geeignet:

  • Eine Datenklasse repräsentiert einen bestimmten Datentyp und ein Datenobjekt repräsentiert einen spezifischer Entitätstyp, einschließlich der Attribute der Entität.

  • Objekte des gleichen Typs können verglichen werden, zum Beispiel größer als, kleiner als oder gleich.

Datenklassendefinition

Im Wesentlichen gibt es an Datenklassen nichts Besonderes. Der @dataclass-Dekorator generiert lediglich automatisch eine Reihe von Methoden wie __repr__, init, __eq__ usw. Definieren Sie die Datenklasse:

from dataclasses import dataclass

@dataclass
class A:
  normal: str
  defVal: int = 0

Decorator

Die vollständige Form der Datenklasse lautet (True dient zum Generieren der entsprechenden Methode, False generiert sie nicht; wenn die entsprechende Methode in der Klasse definiert wurde, wird dieser Parameter ignoriert):

@dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, Frozen=False):

  • init: Die __init__-Methode wird standardmäßig generiert;

  • repr: Die __repr__-Methode wird standardmäßig generiert. Die Zeichenfolge enthält den Klassennamen, jeden Feldnamen und seinen Repr (in der in seiner Klasse definierten Reihenfolge). wird übergeben, die Methode __eq__ wird nicht zur Datenklasse hinzugefügt, sondern erbt das Objekt.__eq__ (vergleiche ID);

  • Reihenfolge: __gt__, __ge__, __lt__, __le__ Methoden werden standardmäßig nicht generiert;

  • unsafe_hash : Wenn es False ist (Standard), basiert es auf eq und eingefrorenen Einstellungen generiert die __hash__()-Methode (verwendet vom integrierten hash()).

  • Wenn eq und Frozen beide wahr sind, wird standardmäßig eine __hash__()-Methode generiert.
    • Wenn eq wahr und Frozen falsch ist, wird __hash__() auf „Keine“ gesetzt und als markiert gesetzt nicht hashbar (was es ist, da es veränderlich ist);

    • Wenn eq falsch ist, bleibt __hash__() unverändert, was bedeutet, dass die __hash__()-Methode der Oberklasse verwendet wird (Wenn die Oberklasse ein Objekt ist, wird auf id zurückgegriffen -basiertes Hashing).

    • eingefroren: Wenn wahr, können die Attribute nach der Initialisierung der Instanz nicht geändert werden; default_factory=MISSING, repr =True, hash=None, init=True, vergleichen=True, metadata=None):
  • default: Falls angegeben, ist dies der Standardwert für dieses Feld.

default_factory: Wird zum Angeben von Feldern mit variablen Standardwerten verwendet. Es muss ein aufrufbares Objekt ohne Parameter sein, das sich gegenseitig mit dem Standardwert ausschließt (kann nicht gleichzeitig angegeben werden).


init: Wenn true (Standard), wird dieses Feld als Parameter in die generierte __init__()-Methode einbezogen.
  • repr: Wenn true (Standard), ist das Feld in der generierten Zeichenfolge enthalten, die von der Methode __repr__() zurückgegeben wird.
  • compare: Wenn true (Standard), wird das Feld in die generierten Gleichheits- und Vergleichsmethoden (__eq__(), __gt__() usw.) einbezogen.
  • hash: Kann ein Boolescher Wert oder None sein:
  • ist None (Standardeinstellung), es wird der Vergleichswert verwendet, was allgemein erwartetes Verhalten ist (es wird davon abgeraten, diesen Wert auf einen anderen Wert als None festzulegen) ;
  • ist wahr, dann ist dieses Feld in der generierten __hash__()-Methode enthalten;
  • Setze hash=False, aber vergleichen=True (das heißt, ein Feld aus dem Hash ausschließen, es aber trotzdem zum Vergleich verwenden) Eins Möglicher Grund dafür ist, dass die Berechnung eines Hashs für ein Feld teuer ist.
  • Metadaten: Dies kann eine Karte sein oder keine. Es wird als leeres Wörterbuch behandelt. Dieser Wert ist in MappingProxyType() enthalten, sodass er schreibgeschützt ist und im Field-Objekt verfügbar gemacht wird (bereitgestellt als Erweiterungsmechanismus eines Drittanbieters).
  • Verwenden Sie default_factory, um Standardwerte zu generieren:
  • 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)
  • Initialisieren

    Vom Dataclass-Dekorator dekorierte Klasse:
  • Keine Notwendigkeit, __init__ zu definieren, Dataclass wird es automatisch verarbeiten;

Vordefiniert in einer einfachen

dataclass fügt automatisch eine __repr__-Funktion hinzu;
  • Datenvergleich kann automatisch Vergleichsmethoden über @dataclass hinzufügen order = True) ( ​​__eq__ und __lt__):
  • Der Vergleich erfolgt über Tupel, die durch Attribute (Felder) generiert werden. Wie oben gezeigt, ist das Vergleichstupel (normal, defVale)

    Mit Compare=False können Sie Felder festlegen, die nicht vorhanden sind Zum Vergleich verwendet:

    @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-processing
  • Die Nachbearbeitung kann über __post_init__ erfolgen (wird automatisch aufgerufen, bevor __init__ zurückkehrt):

    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自动赋值
  • dataclasses-Methode

dataclasses integrierte Eigenschaften und Methoden:

fields(class_or_instance ): Tupel von Feldobjekten zurückgeben;

asdict(instance, *, dict_factory=dict): Datenklasse in Wörterbuch konvertieren, (Name:Wert)-Paar; ) : Konvertieren Sie die Datenklasse in ein Tupel;

replace(instance, **changes): Erstellen Sie ein neues Objekt desselben Typs wie die Instanz, und changes ist der zu ändernde Wert.

    Das obige ist der detaillierte Inhalt vonWie werden Datenklassen in Python verwendet?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen