মূল কন্টেন্টে যান
মডিউল 9 · 2-এর পাঠ 4কোর্সে 34/36~12 min
মডিউল পাঠ (2/4)

dataclass: বয়লারপ্লেট ছাড়া ডেটা ক্লাস

@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` ফিল্ড সহ একটি ডেটাক্লাস `বুক` তৈরি করুন। এটিকে `l = Book('Moby Dick', 635)` হিসেবে স্থাপিত করুন। `l == বই('মবি ডিক', 635)` মূল্যায়ন করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

@dataclass __eq__ ক্ষেত্র অনুসারে ক্ষেত্র তুলনা করে।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম পর্যালোচনা করুন

ব্যায়াম#python.m9.l2.e2
প্রচেষ্টা: 0লোড হচ্ছে...

ডিফল্ট_ফ্যাক্টরি=লিস্ট সহ `আইটেম: তালিকা[str]` ফিল্ড সহ একটি ডেটাক্লাস `বাস্কেট` তৈরি করুন। `c1 = Basket()` এবং `c2 = Basket()`, c1.items-এ 'mela' যুক্ত করুন। তারা একই তালিকা নয় তা যাচাই করতে `(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 প্রচেষ্টার পরে উপলব্ধ