मुख्य सामग्री पर जाएं
मॉड्यूल 9 · पाठ 2 का 4पाठ्यक्रम में 34/36~12 min
मॉड्यूल पाठ (2/4)

डेटाक्लास: बॉयलरप्लेट के बिना डेटा क्लास

@dataclass डेकोरेटर (dataclasses मॉड्यूल) स्वचालित रूप से उत्पन्न करता है __init__, __repr__, और __eq__ उन वर्गों के लिए जिनका एकमात्र काम होल्ड करना है डेटा. कम बॉयलरप्लेट, स्पष्ट कोड।

डेटाक्लास के बिना (बॉयलरप्लेट)

Python
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)

डेटाक्लास के साथ

Python
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

Python
from dataclasses import dataclass, field

@dataclass
class Articolo:
    nome: str
    prezzo: float = 0.0
    tag: list[str] = field(default_factory=list)

जमे हुए = सत्य: अपरिवर्तनीय

Python
@dataclass(frozen=True)
class Coordinata:
    lat: float
    lon: float

c = Coordinata(45.4, 9.2)
c.lat = 99   # FrozenInstanceError!

frozen डेटाक्लास भी हैशेबल हैं: आप उन्हें तानाशाही कुंजी के रूप में उपयोग कर सकते हैं या तत्व सेट करें.

आदेश = सत्य: स्वचालित तुलना

Python
@dataclass(order=True)
class Voto:
    valore: int

Voto(10) < Voto(20)   # True
sorted([Voto(30), Voto(10), Voto(20)])

क्रम में फ़ील्ड की तुलना करके __lt__, __le__, __gt__, __ge__ उत्पन्न करता है उन्हें घोषित कर दिया गया.

सामान्य तरीके

डेटाक्लास नियमित कक्षाएं बनी रहती हैं: आप विधियाँ जोड़ सकते हैं।

Python
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)। यह इन्स्टेन्शियेशन के बाद विशेषताओं को बदलने के किसी भी प्रयास पर एक त्रुटि उत्पन्न करता है, जिससे इंस्टेंस समवर्ती वातावरण के लिए या शब्दकोश कुंजी के रूप में उपयोग के लिए सुरक्षित हो जाता है।

खुद कोशिश करना

व्यायाम#python.m9.l2.e1
प्रयास: 0लोड हो रहा है...

फ़ील्ड `title: str` और `pages: int` के साथ एक डेटाक्लास `Book` बनाएं। इसे `l = Book('मोबी डिक', 635)` के रूप में त्वरित करें। `l == पुस्तक ('मोबी डिक', 635)` का मूल्यांकन करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

@डेटाक्लास फ़ील्ड द्वारा फ़ील्ड की तुलना करके __eq__ उत्पन्न करता है।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम की समीक्षा करें

व्यायाम#python.m9.l2.e2
प्रयास: 0लोड हो रहा है...

फ़ील्ड `आइटम: सूची[str]` के साथ default_factory=list के साथ एक डेटाक्लास `बास्केट` बनाएं। `c1 = Basket()` और `c2 = Basket()` को त्वरित करें, c1.items में 'mela' जोड़ें। यह सत्यापित करने के लिए `(c1.items, c2.items)` का मूल्यांकन करें कि वे समान सूची नहीं हैं।

संपादक लोड हो रहा है...
संकेत दिखाएँ

field(default_factory=list) प्रति उदाहरण एक नई सूची की गारंटी देता है।

3 प्रयासों के बाद समाधान उपलब्ध है

अतिरिक्त चुनौती

व्यायाम#python.m9.l2.e3
प्रयास: 0लोड हो रहा है...

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 प्रयासों के बाद समाधान उपलब्ध है