সংক্ষিপ্ত বিবরণ
প্রশ্ন সম্বোধন করা হয়েছে। যাইহোক, এই উত্তরটি ড্যাটাক্লাসগুলির প্রাথমিক বোঝার ক্ষেত্রে সহায়তা করার জন্য কিছু ব্যবহারিক উদাহরণ যুক্ত করেছে।
পাইথন ডেটা ক্লাসগুলি আসলে কী এবং সেগুলি ব্যবহার করা কখন সেরা?
- কোড জেনারেটর : বয়লারপ্লেট কোড উত্পন্ন; আপনি নিয়মিত ক্লাসে বিশেষ পদ্ধতিগুলি প্রয়োগ করতে বা একটি ডেটাগ্লাস সেগুলি স্বয়ংক্রিয়ভাবে প্রয়োগ করতে পারেন।
- ডেটা পাত্রে : স্ট্রাকচারগুলি যা ডেটা ধরে রাখে (যেমন: টুপলস এবং ডিক্টস), প্রায়শই বিন্দুযুক্ত, অ্যাট্রিবিউট অ্যাক্সেস যেমন শ্রেণি
namedtuple
এবং অন্যদের সাথে থাকে ।
"ডিফল্ট [গুলি] এর সাথে নাম পরিবর্তনকারী"
পরবর্তী বাক্যাংশটির অর্থ এখানে:
- পরিবর্তনীয় : ডিফল্টরূপে, ডেটাগ্লাস বৈশিষ্ট্যগুলি পুনরায় নিয়োগ দেওয়া যেতে পারে। আপনি optionচ্ছিকভাবে এগুলি পরিবর্তনযোগ্য করতে পারেন (নীচের উদাহরণগুলি দেখুন)।
- নেমটিউটল : আপনি
namedtuple
কোনও নিয়মিত ক্লাসের মতো বিন্দুযুক্ত, অ্যাট্রিবিউট অ্যাক্সেস পেয়েছেন ।
- ডিফল্ট : আপনি বৈশিষ্ট্যগুলিতে ডিফল্ট মান নির্ধারণ করতে পারেন।
সাধারণ শ্রেণীর তুলনায় আপনি প্রাথমিকভাবে বয়লারপ্লেট কোড টাইপ করে সংরক্ষণ করুন।
বৈশিষ্ট্য
এটি ডেটাগ্লাস বৈশিষ্ট্যগুলির একটি ওভারভিউ (টিএল; ডিআর? পরবর্তী বিভাগে সংক্ষিপ্তসার সারণি দেখুন)।
তুমি কি পেলে
ডেটা চশমা থেকে আপনি ডিফল্টরূপে পাবেন এমন বৈশিষ্ট্য এখানে।
বৈশিষ্ট্য + উপস্থাপনা + তুলনা
import dataclasses
@dataclasses.dataclass
#@dataclasses.dataclass() # alternative
class Color:
r : int = 0
g : int = 0
b : int = 0
এই ডিফল্টগুলি স্বয়ংক্রিয়ভাবে নিম্নলিখিত কীওয়ার্ডগুলি সেট করে সরবরাহ করা হয় True
:
@dataclasses.dataclass(init=True, repr=True, eq=True)
আপনি কি চালু করতে পারেন
উপযুক্ত কীওয়ার্ড সেট করা থাকলে অতিরিক্ত বৈশিষ্ট্য উপলব্ধ True
।
ক্রম
@dataclasses.dataclass(order=True)
class Color:
r : int = 0
g : int = 0
b : int = 0
অর্ডারিং পদ্ধতিগুলি এখন প্রয়োগ করা হয় (ওভারলোডিং অপারেটর < > <= >=
:) একইভাবে functools.total_ordering
শক্তিশালী সাম্য পরীক্ষার সাথেও।
হাস্যযোগ্য, পরিবর্তনযোগ্য
@dataclasses.dataclass(unsafe_hash=True) # override base `__hash__`
class Color:
...
যদিও বস্তুটি সম্ভাব্যভাবে পরিবর্তনযোগ্য (সম্ভবত অনাকাঙ্ক্ষিত), একটি হ্যাশ প্রয়োগ করা হয়েছে।
হাস্যযোগ্য, অপরিবর্তনীয়
@dataclasses.dataclass(frozen=True) # `eq=True` (default) to be immutable
class Color:
...
একটি হ্যাশ এখন প্রয়োগ করা হয়েছে এবং অবজেক্ট পরিবর্তন করা বা বৈশিষ্ট্যগুলি নির্ধারিত করা অনুমোদিত নয়।
সামগ্রিকভাবে, বস্তুটি হ্যাশযোগ্য যদি হয় unsafe_hash=True
বা হয় frozen=True
।
আরও বিশদ সহ আসল হ্যাশিং লজিক টেবিলটিও দেখুন।
আপনি কি পাবেন না
নিম্নলিখিত বৈশিষ্ট্যগুলি পেতে, বিশেষ পদ্ধতিগুলি ম্যানুয়ালি প্রয়োগ করতে হবে:
আন-প্যাক
@dataclasses.dataclass
class Color:
r : int = 0
g : int = 0
b : int = 0
def __iter__(self):
yield from dataclasses.astuple(self)
অপ্টিমাইজেশান
@dataclasses.dataclass
class SlottedColor:
__slots__ = ["r", "b", "g"]
r : int
g : int
b : int
বস্তুর আকার এখন হ্রাস করা হয়েছে:
>>> imp sys
>>> sys.getsizeof(Color)
1056
>>> sys.getsizeof(SlottedColor)
888
কিছু পরিস্থিতিতে, __slots__
উদাহরণগুলি তৈরি করতে এবং বৈশিষ্ট্য অ্যাক্সেস করার গতিও উন্নত করে। এছাড়াও, স্লটগুলি ডিফল্ট অ্যাসাইনমেন্টের অনুমতি দেয় না; অন্যথায়, একটি ValueError
উত্থাপিত হয়।
এই ব্লগ পোস্টে স্লট আরও দেখুন ।
সারমর্ম সারনি
+----------------------+----------------------+----------------------------------------------------+-----------------------------------------+
| Feature | Keyword | Example | Implement in a Class |
+----------------------+----------------------+----------------------------------------------------+-----------------------------------------+
| Attributes | init | Color().r -> 0 | __init__ |
| Representation | repr | Color() -> Color(r=0, g=0, b=0) | __repr__ |
| Comparision* | eq | Color() == Color(0, 0, 0) -> True | __eq__ |
| | | | |
| Order | order | sorted([Color(0, 50, 0), Color()]) -> ... | __lt__, __le__, __gt__, __ge__ |
| Hashable | unsafe_hash/frozen | {Color(), {Color()}} -> {Color(r=0, g=0, b=0)} | __hash__ |
| Immutable | frozen + eq | Color().r = 10 -> TypeError | __setattr__, __delattr__ |
| | | | |
| Unpacking+ | - | r, g, b = Color() | __iter__ |
| Optimization+ | - | sys.getsizeof(SlottedColor) -> 888 | __slots__ |
+----------------------+----------------------+----------------------------------------------------+-----------------------------------------+
+ এই পদ্ধতিগুলি স্বয়ংক্রিয়ভাবে উত্পন্ন হয় না এবং একটি ড্যাটাক্লাসে ম্যানুয়াল বাস্তবায়ন প্রয়োজন।
* __ne__
প্রয়োজন হয় না এবং এভাবে প্রয়োগ করা হয় না ।
অতিরিক্ত বৈশিষ্ট্য
পোস্ট-আরম্ভের
@dataclasses.dataclass
class RGBA:
r : int = 0
g : int = 0
b : int = 0
a : float = 1.0
def __post_init__(self):
self.a : int = int(self.a * 255)
RGBA(127, 0, 255, 0.5)
# RGBA(r=127, g=0, b=255, a=127)
উত্তরাধিকার
@dataclasses.dataclass
class RGBA(Color):
a : int = 0
রূপান্তর
একটি ডেটাক্লাসকে টুপলে বা ডিকে রূপান্তর করুন, পুনরাবৃত্তভাবে :
>>> dataclasses.astuple(Color(128, 0, 255))
(128, 0, 255)
>>> dataclasses.asdict(Color(128, 0, 255))
{r: 128, g: 0, b: 255}
সীমাবদ্ধতা
তথ্যসূত্র
- আর Hettinger এর আলাপ উপর Dataclasses: সব কোড জেনারেটর শেষ করতে কোড জেনারেটরের
- টি Hunner এর আলাপ উপর সকল Cruft ছাড়া পাইথন ক্লাস: সহজ ক্লাস
- হ্যাশিংয়ের বিশদ সম্পর্কিত পাইথনের ডকুমেন্টেশন
- পাইথন ৩.7-তে ডেটা ক্লাসের চূড়ান্ত গাইড সম্পর্কে রিয়েল পাইথনের গাইড
- উ: শ এর ব্লগ পোস্ট উপর পাইথন 3.7 ডেটা ক্লাস একটি সংক্ষিপ্ত সফর
- ই স্মিথের GitHub সংগ্রহস্থলের উপর dataclasses
namedtuple
গুলি পরিবর্তনযোগ্য এবং বৈশিষ্ট্যের জন্য ডিফল্ট মান থাকতে পারে না, যেখানে ডেটা ক্লাসগুলি পরিবর্তনীয় এবং সেগুলি থাকতে পারে।