Heim >Backend-Entwicklung >Python-Tutorial >Ausführliche Erklärung des Dataclass Decorators, einer neuen Funktion von Python 3.7
Dieser Artikel führt Sie hauptsächlich in die neuen Funktionen von Python 3.7 ein. Der Artikel stellt sie ausführlich anhand von Beispielcode vor. Es hat einen gewissen Referenz-Lernwert für alle, die es brauchen es Lasst uns gemeinsam lernen.
Vorwort
Python 3.7 wird diesen Sommer veröffentlicht und es wird viele neue Dinge in Python 3.7 geben:
Verschiedene Zeichensatzverbesserungen
Verzögerte Auswertung von Annotationen
und Unterstützung für Datenklassen
Eine der aufregendsten neuen Funktionen ist der Dataclass Decorator.
Was ist eine Datenklasse?
Die meisten Python-Entwickler haben viele Klassen wie die folgenden geschrieben:
class MyClass: def __init__(self, var_a, var_b): self.var_a = var_a self.var_b = var_b
dataclass kann automatisch Methoden für einfache Fälle generieren, zum Beispiel akzeptiert ein __init__ diese Parameter und weist sie sich selbst zu, das vorherige kleine Beispiel kann wie folgt umgeschrieben werden:
@dataclass class MyClass: var_a: str var_b: str
Schauen wir uns anhand eines Beispiels an, wie man es verwendet
Star Wars API
Sie können Anfragen verwenden, um Ressourcen von der Star Wars-API abzurufen:
response = requests.get('https://swapi.co/api/films/1/') dictionary = response.json()
Werfen wir einen Blick auf das Wörterbuch (vereinfacht). Ergebnis von:
{ 'characters': ['https://swapi.co/api/people/1/',… ], 'created': '2014-12-10T14:23:31.880000Z', 'director': 'George Lucas', 'edited': '2015-04-11T09:46:52.774897Z', 'episode_id': 4, 'opening_crawl': 'It is a period of civil war.\r\n … ', 'planets': ['https://swapi.co/api/planets/2/', … ], 'producer': 'Gary Kurtz, Rick McCallum', 'release_date': '1977-05-25', 'species': ['https://swapi.co/api/species/5/',…], 'starships': ['https://swapi.co/api/starships/2/',…], 'title': 'A New Hope', 'url': 'https://swapi.co/api/films/1/', 'vehicles': ['https://swapi.co/api/vehicles/4/',…]
Kapselungs-API
Um eine korrekt zu kapseln API sollten wir ein Objekt erstellen, das Benutzer in ihren Anwendungen verwenden können. Definieren Sie daher in Python 3.6 ein Objekt, das Anfragen und Antworten auf /films/endpoint enthält:
class StarWarsMovie: def __init__(self, title: str, episode_id: int, opening_crawl: str, director: str, producer: str, release_date: datetime, characters: List[str], planets: List[str], starships: List[str], vehicles: List[str], species: List[str], created: datetime, edited: datetime, url: str ): self.title = title self.episode_id = episode_id self.opening_crawl= opening_crawl self.director = director self.producer = producer self.release_date = release_date self.characters = characters self.planets = planets self.starships = starships self.vehicles = vehicles self.species = species self.created = created self.edited = edited self.url = url if type(self.release_date) is str: self.release_date = dateutil.parser.parse(self.release_date) if type(self.created) is str: self.created = dateutil.parser.parse(self.created) if type(self.edited) is str: self.edited = dateutil.parser.parse(self.edited)
Aufmerksame Leser haben hier möglicherweise wiederholten Code bemerkt.
Dies ist ein klassischer Fall der Verwendung des Dataclass-Dekorators. Wir müssen eine Klasse erstellen, die hauptsächlich zum Speichern von Daten verwendet wird, mit nur einer kleinen Validierung. Schauen wir uns also an, was wir ändern müssen.
Zunächst generiert die Datenklasse automatisch einige Dunder-Methoden. Wenn wir keine Optionen für den Datenklassendekorator angeben, sind die generierten Methoden: __init__, __eq__ und __repr__, wenn Sie __repr__ definiert haben, __str__ jedoch nicht definiert, und standardmäßig implementiert Python (nicht nur Datenklassen) die Ausgabemethode __str__, die __repr__ zurückgibt. Daher können die vier Dunder-Methoden implementiert werden, indem einfach der Code wie folgt geändert wird:
@dataclass class StarWarsMovie: title: str episode_id: int opening_crawl: str director: str producer: str release_date: datetime characters: List[str] planets: List[str] starships: List[str] vehicles: List[str] species: List[str] created: datetime edited: datetime url: str
Wir haben die __init__-Methode entfernt, um sicherzustellen, dass die Daten A Der Klassendekorateur kann die entsprechenden von ihm generierten Methoden hinzufügen. Allerdings haben wir dabei einige Funktionen verloren. Unser Python 3.6-Konstruktor definiert nicht nur alle Werte, sondern versucht auch, das Datum zu analysieren. Wie können wir das mit einer Datenklasse machen?
Wenn wir __init__ überschreiben möchten, verlieren wir den Vorteil der Datenklasse. Wenn wir also zusätzliche Funktionen verarbeiten möchten, können wir die neue Dunder-Methode verwenden: __post_init__, sehen wir uns die Methode __post_init__ für unsere Wrapper-Klasse an. Was Sieht es so aus:
def __post_init__(self): if type(self.release_date) is str: self.release_date = dateutil.parser.parse(self.release_date) if type(self.created) is str: self.created = dateutil.parser.parse(self.created) if type(self.edited) is str: self.edited = dateutil.parser.parse(self.edited)
Das ist es! Wir können den Datenklassendekorator verwenden, um unsere Klasse in zwei Dritteln des Codes zu implementieren.
Weitere Extras
Die Datenklasse kann mithilfe der Optionen des Dekorators weiter an den Anwendungsfall angepasst werden. Die Standardoptionen sind:
@dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False)
init bestimmt, ob generiert werden soll __init__ dunder method
repr legt fest, ob generiert werden soll __repr__ dunder-Methode
eq macht dasselbe für __eq__ dunder-Methode, die das Verhalten der Gleichheitsprüfung bestimmt (your_class_instance == another_instance)
orderactual Es gibt vier auf erstellte Dunder-Methoden, die das Verhalten aller Prüfungen für kleiner als und/oder größer als bestimmen. Wenn sie auf „true“ gesetzt sind, kann die Liste der Objekte sortiert werden.
Die letzten beiden Optionen bestimmen, ob das Objekt gehasht werden kann, was notwendig ist, wenn Sie Objekte Ihrer Klasse als Wörterbuchschlüssel verwenden möchten.
Weitere Informationen finden Sie unter: PEP 557 – Datenklassen
Das obige ist der detaillierte Inhalt vonAusführliche Erklärung des Dataclass Decorators, einer neuen Funktion von Python 3.7. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!