अवलोकन
सवाल का समाधान किया गया है। हालाँकि, यह उत्तर डेटैकल्स की बुनियादी समझ में सहायता करने के लिए कुछ व्यावहारिक उदाहरण जोड़ता है।
अजगर डेटा वर्ग वास्तव में क्या हैं और उनका उपयोग करना कब सबसे अच्छा है?
- कोड जनरेटर : बॉयलरप्लेट कोड उत्पन्न करते हैं; आप नियमित कक्षा में विशेष विधियों को लागू करने का विकल्प चुन सकते हैं या डेटाक्लास उन्हें स्वचालित रूप से लागू कर सकते हैं।
- डेटा कंटेनर : संरचनाएं जो डेटा रखती हैं (उदाहरण के लिए ट्यूपल्स और डीकट्स), अक्सर बिंदीदार, विशेषता पहुंच जैसे कि कक्षाएं,
namedtupleऔर अन्य ।
"डिफ़ॉल्ट के साथ परस्पर नामांकित नाम [s]"
यहाँ बाद वाले वाक्यांश का अर्थ है:
- परिवर्तनशील : डिफ़ॉल्ट रूप से, डिटैचेस विशेषताओं को पुन: असाइन किया जा सकता है। आप वैकल्पिक रूप से उन्हें अपरिवर्तनीय बना सकते हैं (नीचे उदाहरण देखें)।
- nametuple : आपने बिंदी लगाई है , विशेषता एक्सेस ए की तरह
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।
अधिक विवरण के साथ मूल हैशिंग लॉजिक टेबल भी देखें।
जो आपको नहीं मिलता
निम्नलिखित विशेषताएं प्राप्त करने के लिए, विशेष विधियों को मैन्युअल रूप से लागू किया जाना चाहिए:
unpacking
@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}
सीमाएं
संदर्भ
- डेटासलैक्स पर आर। हेटिंगर की बात : सभी कोड जनरेटर को समाप्त करने के लिए कोड जनरेटर
- टी Hunner के बात पर सब cruft बिना अजगर क्लास: आसान कक्षाएं
- हैशिंग विवरण पर अजगर का प्रलेखन
- रियल पायथन के गाइड पर पायथन 3.7 में डाटा वर्ग को द अल्टिमेट गाइड
- ए। शॉ का ब्लॉग पाइथन 3.7 डेटा क्लासेस के संक्षिप्त दौरे पर पोस्ट है
- ई। स्मिथ की गिथब रिपॉजिटरी ऑन डाटाकेल्स
namedtuples अपरिवर्तनीय हैं और उनमें विशेषताओं के लिए डिफ़ॉल्ट मान नहीं हो सकते हैं, जबकि डेटा वर्ग परस्पर हैं और उनके पास हो सकते हैं।