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

Wie werden Datenklassen in Python verwendet?

WBOY
Freigeben: 2023-04-23 17:22:07
nach vorne
1496 Leute haben es durchsucht

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
Nach dem Login kopieren

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)
    Nach dem Login kopieren
  • 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排序
    Nach dem Login kopieren
  • 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自动赋值
    Nach dem Login kopieren
    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!

    Verwandte Etiketten:
    Quelle:yisu.com
    Erklärung dieser Website
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
    Beliebte Tutorials
    Mehr>
    Neueste Downloads
    Mehr>
    Web-Effekte
    Quellcode der Website
    Website-Materialien
    Frontend-Vorlage