ماڈیول اسباق (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 باقی بناتا ہے۔
ڈیفالٹ اور ڈیفالٹ_فیکٹری۔
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)۔ یہ انسٹینٹیشن کے بعد صفات کو تبدیل کرنے کی کسی بھی کوشش پر ایک غلطی پیدا کرتا ہے، مثالوں کو ہم آہنگی کے ماحول یا لغت کی چابیاں کے طور پر استعمال کرنے کے لیے محفوظ بناتا ہے۔
خود ہی آزمائیں۔
فیلڈز `عنوان: str` اور `صفحات: int` کے ساتھ ڈیٹا کلاس `Book` بنائیں۔ اسے `l = Book('Moby Dick', 635)` کے طور پر فوری بنائیں۔ `l == کتاب ('Moby Dick', 635)` کا اندازہ کریں۔
اشارہ دکھائیں۔
@dataclass __eq__ فیلڈ کے لحاظ سے موازنہ کرنے والی فیلڈ تیار کرتا ہے۔
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش کا جائزہ لیں۔
ڈیفالٹ_فیکٹری = فہرست کے ساتھ فیلڈ `آئٹمز: فہرست[str]` کے ساتھ ڈیٹا کلاس `باسکٹ` بنائیں۔ `c1 = باسکٹ()` اور `c2 = باسکٹ()` کو فوری بنائیں، 'mela' کو c1.items میں شامل کریں۔ اس بات کی تصدیق کے لیے `(c1.items, c2.items)` کا اندازہ لگائیں کہ وہ ایک ہی فہرست میں نہیں ہیں۔
اشارہ دکھائیں۔
فیلڈ(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: float اور y: float کا اعلان کریں۔
3 کوششوں کے بعد حل دستیاب ہے۔