dataclasses পাইথনের স্ট্যান্ডার্ড লাইব্রেরিতে একটি নতুন মডিউল যা সংস্করণ ৩.৭ থেকে যোগ করা হয়েছে। এটি @dataclass ডেকোরেটর সংজ্ঞায়িত করে যা একটি ইউজার-ডিফাইন্ড ক্লাসের জন্য কনস্ট্রাক্টর ম্যাজিক মেথড __init__(), স্ট্রিং রিপ্রেজেন্টেশন মেথড __repr__(), == অপারেটর ওভারলোড করার __eq__() মেথড (এবং আরও কিছু) স্বয়ংক্রিয়ভাবে জেনারেট করে।
dataclass ডেকোরেটর সিগনেচার
dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False)
সকল আর্গুমেন্ট বুলিয়ান মান নেয় যা নির্দেশ করে সংশ্লিষ্ট ম্যাজিক মেথড বা মেথডগুলোর স্বয়ংক্রিয় জেনারেশন হবে কিনা।
- init আর্গুমেন্ট ডিফল্টভাবে True। এটি ক্লাসের জন্য __init__() মেথড স্বয়ংক্রিয়ভাবে জেনারেট করে।
- repr আর্গুমেন্টও ডিফল্টভাবে True। অতএব __repr__() মেথড স্বয়ংক্রিয়ভাবে জেনারেট হবে। __repr__() হলো অবজেক্টের ফরম্যাল স্ট্রিং রিপ্রেজেন্টেশন। যদি ক্লাসটি ইতিমধ্যে __repr__() সংজ্ঞায়িত করে থাকে, তবে এই প্যারামিটার উপেক্ষা করা হয়।
- eq আর্গুমেন্ট ডিফল্টভাবে True। এটি __eq__() মেথড অটো-জেনারেট করে। এই মেথড সমানতা তুলনা অপারেটর (==) এর প্রতিক্রিয়ায় কল হয়। আবার, যদি ক্লাসটি ইতিমধ্যে __eq__() সংজ্ঞায়িত করে থাকে, তবে এই প্যারামিটার উপেক্ষা করা হয়।
- order প্যারামিটার True হলে (ডিফল্ট False), তুলনার জন্য ম্যাজিক মেথড __lt__(), __le__(), __gt__(), এবং __ge__() অটো-জেনারেট হবে, যা যথাক্রমে <, <=, >, এবং >= অপারেটর ইমপ্লিমেন্ট করে। order True এবং eq False হলে ValueError উত্থাপিত হয়। যদি ক্লাসটি ইতিমধ্যে এই মেথডগুলোর যেকোনো একটি সংজ্ঞায়িত করে থাকে, তবে TypeError হয়।
- unsafe_hash আর্গুমেন্ট False হলে (ডিফল্ট), eq এবং frozen কীভাবে সেট আছে তার অনুযায়ী __hash__() মেথড জেনারেট হয়।
- frozen আর্গুমেন্ট: True হলে (ডিফল্ট False), রিড-অনলি ফ্রোজেন ইনস্ট্যান্স অনুকরণ করে।
উদাহরণ
Student ক্লাসটি dataclass ডেকোরেটর ব্যবহার করে নিচের মত করে ডিফাইন করা যাক:
from dataclasses import dataclass
@dataclass
class Student(object):
name: str
age: int
percent: float
স্বয়ংক্রিয়ভাবে জেনারেট হওয়া __init__() মেথড হবে:
def __init__(self, name: str, age: int, percent: float):
self.name = name
self.age = age
self.percent = percent
যদি ক্লাসটি স্পষ্টভাবে __init__() মেথড সংজ্ঞায়িত করে, তবে init প্যারামিটার উপেক্ষা করা হয়।
>>> from dataclasses import Student
>>> s1 = Student('Naveen', 21, 50.50)
>>> s2 = Student('Mangesh', 20, 50.00)
>>> s1 == s2
False
asdict()
এই ফাংশন ক্লাস ইনস্ট্যান্সকে একটি ডিকশনারি অবজেক্টে রূপান্তর করে।
>>> import dataclasses
>>> dataclasses.asdict(s1)
{'name': 'Naveen', 'age': 21, 'percent': 50.5}
astuple()
এই ফাংশন ক্লাস ইনস্ট্যান্সকে একটি টাপল অবজেক্টে রূপান্তর করে।
>>> dataclasses.astuple(s2)
('Mahesh', 20, 50.0)
make_dataclass()
এই ফাংশন fields আর্গুমেন্ট হিসেবে দেওয়া টাপলের তালিকা থেকে একটি নতুন ডেটা ক্লাস তৈরি করে।
>>> NewClass = dataclasses.make_dataclass('NewClass', [('x', int), ('y', float)])
>>> n = NewClass(10, 20)
>>> n
NewClass(x=10, y=20)