مرکزی مواد پر جائیں
ماڈیول 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 باقی بناتا ہے۔

ڈیفالٹ اور ڈیفالٹ_فیکٹری۔

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لوڈ ہو رہا ہے…

فیلڈز `عنوان: str` اور `صفحات: int` کے ساتھ ڈیٹا کلاس `Book` بنائیں۔ اسے `l = Book('Moby Dick', 635)` کے طور پر فوری بنائیں۔ `l == کتاب ('Moby Dick', 635)` کا اندازہ کریں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

@dataclass __eq__ فیلڈ کے لحاظ سے موازنہ کرنے والی فیلڈ تیار کرتا ہے۔

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش کا جائزہ لیں۔

ورزش#python.m9.l2.e2
کوششیں: 0لوڈ ہو رہا ہے…

ڈیفالٹ_فیکٹری = فہرست کے ساتھ فیلڈ `آئٹمز: فہرست[str]` کے ساتھ ڈیٹا کلاس `باسکٹ` بنائیں۔ `c1 = باسکٹ()` اور `c2 = باسکٹ()` کو فوری بنائیں، 'mela' کو c1.items میں شامل کریں۔ اس بات کی تصدیق کے لیے `(c1.items, c2.items)` کا اندازہ لگائیں کہ وہ ایک ہی فہرست میں نہیں ہیں۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

فیلڈ(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: float اور y: float کا اعلان کریں۔

3 کوششوں کے بعد حل دستیاب ہے۔