মডিউল পাঠ (2/4)
dataclass: বয়লারপ্লেট ছাড়া ডেটা ক্লাস
@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` ফিল্ড সহ একটি ডেটাক্লাস `বুক` তৈরি করুন। এটিকে `l = Book('Moby Dick', 635)` হিসেবে স্থাপিত করুন। `l == বই('মবি ডিক', 635)` মূল্যায়ন করুন।
ইঙ্গিত দেখান
@dataclass __eq__ ক্ষেত্র অনুসারে ক্ষেত্র তুলনা করে।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
ব্যায়াম পর্যালোচনা করুন
ডিফল্ট_ফ্যাক্টরি=লিস্ট সহ `আইটেম: তালিকা[str]` ফিল্ড সহ একটি ডেটাক্লাস `বাস্কেট` তৈরি করুন। `c1 = Basket()` এবং `c2 = Basket()`, c1.items-এ 'mela' যুক্ত করুন। তারা একই তালিকা নয় তা যাচাই করতে `(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 প্রচেষ্টার পরে উপলব্ধ