मॉड्यूल पाठ (2/4)
डेटाक्लास: बॉयलरप्लेट के बिना डेटा क्लास
@dataclass डेकोरेटर (dataclasses मॉड्यूल) स्वचालित रूप से उत्पन्न करता है
__init__, __repr__, और __eq__ उन वर्गों के लिए जिनका एकमात्र काम होल्ड करना है
डेटा. कम बॉयलरप्लेट, स्पष्ट कोड।
डेटाक्लास के बिना (बॉयलरप्लेट)
class Punto:
def __init__(self, x: float, y: float) -> None:
self.x = x
self.y = y
def __repr__(self) -> str:
return f"Punto(x={self.x}, y={self.y})"
def __eq__(self, other) -> bool:
if not isinstance(other, Punto):
return NotImplemented
return (self.x, self.y) == (other.x, other.y)डेटाक्लास के साथ
from dataclasses import dataclass
@dataclass
class Punto:
x: float
y: float
p = Punto(3, 4)
p # Punto(x=3, y=4) ← __repr__ gratis
Punto(3, 4) == Punto(3, 4) # True ← __eq__ gratis
p.x, p.y # 3, 4पैटर्न: फ़ील्ड को क्लास एनोटेशन के रूप में घोषित करें (name: type),
वैकल्पिक रूप से एक डिफ़ॉल्ट मान के साथ। @dataclass शेष उत्पन्न करता है।
डिफ़ॉल्ट और default_factory
from dataclasses import dataclass, field
@dataclass
class Articolo:
nome: str
prezzo: float = 0.0
tag: list[str] = field(default_factory=list)जमे हुए = सत्य: अपरिवर्तनीय
@dataclass(frozen=True)
class Coordinata:
lat: float
lon: float
c = Coordinata(45.4, 9.2)
c.lat = 99 # FrozenInstanceError!frozen डेटाक्लास भी हैशेबल हैं: आप उन्हें तानाशाही कुंजी के रूप में उपयोग कर सकते हैं
या तत्व सेट करें.
आदेश = सत्य: स्वचालित तुलना
@dataclass(order=True)
class Voto:
valore: int
Voto(10) < Voto(20) # True
sorted([Voto(30), Voto(10), Voto(20)])क्रम में फ़ील्ड की तुलना करके __lt__, __le__, __gt__, __ge__ उत्पन्न करता है
उन्हें घोषित कर दिया गया.
सामान्य तरीके
डेटाक्लास नियमित कक्षाएं बनी रहती हैं: आप विधियाँ जोड़ सकते हैं।
import math
from dataclasses import dataclass
@dataclass
class Punto:
x: float
y: float
def distanza_dall_origine(self) -> float:
return math.hypot(self.x, self.y)
Punto(3, 4).distanza_dall_origine() # 5.0अपरिवर्तनीय और कुशल डेटाक्लास
आप डेकोरेटर को तर्क frozen=True पास करके डेटाक्लास को अपरिवर्तनीय बना सकते हैं: @dataclass(frozen=True)। यह इन्स्टेन्शियेशन के बाद विशेषताओं को बदलने के किसी भी प्रयास पर एक त्रुटि उत्पन्न करता है, जिससे इंस्टेंस समवर्ती वातावरण के लिए या शब्दकोश कुंजी के रूप में उपयोग के लिए सुरक्षित हो जाता है।
खुद कोशिश करना
फ़ील्ड `title: str` और `pages: int` के साथ एक डेटाक्लास `Book` बनाएं। इसे `l = Book('मोबी डिक', 635)` के रूप में त्वरित करें। `l == पुस्तक ('मोबी डिक', 635)` का मूल्यांकन करें।
संकेत दिखाएँ
@डेटाक्लास फ़ील्ड द्वारा फ़ील्ड की तुलना करके __eq__ उत्पन्न करता है।
3 प्रयासों के बाद समाधान उपलब्ध है
व्यायाम की समीक्षा करें
फ़ील्ड `आइटम: सूची[str]` के साथ default_factory=list के साथ एक डेटाक्लास `बास्केट` बनाएं। `c1 = Basket()` और `c2 = Basket()` को त्वरित करें, c1.items में 'mela' जोड़ें। यह सत्यापित करने के लिए `(c1.items, c2.items)` का मूल्यांकन करें कि वे समान सूची नहीं हैं।
संकेत दिखाएँ
field(default_factory=list) प्रति उदाहरण एक नई सूची की गारंटी देता है।
3 प्रयासों के बाद समाधान उपलब्ध है
अतिरिक्त चुनौती
Import `dataclass` from `dataclasses`. Create a dataclass `Point` containing two float coordinates `x` and `y`. Instantiate a point with `x=1.5` and `y=2.5` storing it in `p`. Finally, evaluate `p`.
संकेत दिखाएँ
क्लास पॉइंट के ऊपर @dataclass का उपयोग करें, और x: फ्लोट और y: फ्लोट घोषित करें।
3 प्रयासों के बाद समाधान उपलब्ध है