Heim >Backend-Entwicklung >Python-Tutorial >Ausführliche Erklärung des Dataclass Decorators, einer neuen Funktion von Python 3.7

Ausführliche Erklärung des Dataclass Decorators, einer neuen Funktion von Python 3.7

不言
不言Original
2018-04-21 14:44:591780Durchsuche

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!

Stellungnahme:
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