Datenklassen sind nur normale Klassen, die auf die Speicherung von Status ausgerichtet sind, mehr als nur eine Menge Logik enthalten. Jedes Mal, wenn Sie eine Klasse erstellen, die hauptsächlich aus Attributen besteht, haben Sie eine Datenklasse erstellt.
Was das dataclasses
Modul macht, ist es leichter Datenklassen zu erstellen. Es kümmert sich um eine große Kesselplatte für Sie.
Dies ist besonders wichtig, wenn Ihre Datenklasse überprüfbar sein muss; Dies erfordert eine __hash__
Methode sowie eine __eq__
Methode. Wenn Sie eine benutzerdefinierte __repr__
Methode zur einfachen Fehlersuche hinzufügen, dass kann sehr ausführliche werden:
class InventoryItem:
'''Class for keeping track of an item in inventory.'''
name: str
unit_price: float
quantity_on_hand: int = 0
def __init__(
self,
name: str,
unit_price: float,
quantity_on_hand: int = 0
) -> None:
self.name = name
self.unit_price = unit_price
self.quantity_on_hand = quantity_on_hand
def total_cost(self) -> float:
return self.unit_price * self.quantity_on_hand
def __repr__(self) -> str:
return (
'InventoryItem('
f'name={self.name!r}, unit_price={self.unit_price!r}, '
f'quantity_on_hand={self.quantity_on_hand!r})'
def __hash__(self) -> int:
return hash(self.name)^hash(self.unit_price)^hash(self.quantity_on_hand)
def __eq__(self, other) -> bool:
if not isinstance(other, InventoryItem):
return NotImplemented
return (
(self.name, self.unit_price, self.quantity_on_hand) ==
(other.name, other.unit_price, other.quantity_on_hand))
Mit dataclasses
können Sie reduzieren sie auf:
from dataclasses import dataclass
@dataclass(hash=True)
class InventoryItem:
'''Class for keeping track of an item in inventory.'''
name: str
unit_price: float
quantity_on_hand: int = 0
def total_cost(self) -> float:
return self.unit_price * self.quantity_on_hand
derselben Klasse Dekorateur auch Vergleichsmethoden erzeugen können (__lt__
, __gt__
, etc.) und behandeln Unveränderlichkeit.
namedtuple
Klassen sind auch Datenklassen, sind aber standardmäßig unveränderlich (und sind auch Sequenzen). dataclasses
sind in dieser Hinsicht viel flexibler.
Die PEP wurde von der attrs
project inspiriert, die noch mehr tun kann (einschließlich Slots, Validatoren, Konverter, Metadaten usw.).
Wenn Sie einige Beispiele sehen wollen, ich day 7, day 8, day 11 und day 20 kürzlich dataclasses
für einige meiner 2017 Advent of Code Lösungen verwendet werden, für die Lösungen sehen.
Angesichts der umfangreichen Inhalte der PEP, was möchten Sie noch wissen? 'namedtuple's sind unveränderlich und können keine Standardwerte für die Attribute haben, wohingegen Datenklassen änderbar sind und diese haben können. – jonrsharpe
@jonrsharpe Scheint mir vernünftig, dass es einen Stackover-Thread zum Thema geben sollte. Stackoverflow soll eine Enzyklopädie im Q & A-Format sein, nein? Die Antwort ist niemals "Schau einfach auf diese andere Website". Hier hätte es keine Downvotes geben sollen. –