यह pylint
अंधे नियमों का एक और मामला है।
"कक्षाएं डेटा संग्रहीत करने के लिए नहीं हैं" - यह एक गलत कथन है। शब्दकोश सब कुछ के लिए अच्छा नहीं हैं। एक कक्षा का एक डेटा सदस्य कुछ सार्थक है, एक शब्दकोष कुछ वैकल्पिक है। प्रमाण: आप इसे dictionary.get('key', DEFAULT_VALUE)
रोकने के लिए कर सकते हैं KeyError
, लेकिन __getattr__
डिफ़ॉल्ट के साथ कोई सरल नहीं है ।
EDIT - संरचना का उपयोग करने के लिए अनुशंसित तरीके
मुझे अपना उत्तर अपडेट करने की आवश्यकता है। अभी - अगर आपको जरूरत है struct
, तो आपके पास दो बेहतरीन विकल्प हैं:
a) बस उपयोग करें attrs
ये उसके लिए एक पुस्तकालय है:
https://www.attrs.org/en/stable/
import attr
@attr.s
class MyClass(object): # or just MyClass: for Python 3
foo = attr.ib()
bar = attr.ib()
आपको क्या अतिरिक्त मिलेगा: कंस्ट्रक्टर, डिफॉल्ट वैल्यू, वेलिडेशन __repr__
, रीड-ओनली ऑब्जेक्ट्स (रिप्लेस करने के लिए namedtuples
, यहां तक कि पायथन 2 में भी) नहीं लिखना ।
b) उपयोग dataclasses
(Py 3.7+)
Hwjp की टिप्पणी के बाद, मैं भी सिफारिश करता हूं dataclasses
:
https://docs.python.org/3/library/dataclasses.html
यह लगभग उतना ही अच्छा है attrs
, और एक मानक पुस्तकालय तंत्र ("बैटरी शामिल है") है, जिसमें कोई अतिरिक्त निर्भरता नहीं है, सिवाय पायथन 3.7+ के।
शेष पिछला उत्तर
NamedTuple
महान नहीं है - विशेष रूप से अजगर 3 से पहले typing.NamedTuple
:
https://docs.python.org/3/library/typing.html#typing.NamedTuple
- आपको निश्चित रूप से "वर्ग NamedTuple
" पैटर्न से प्राप्त होना चाहिए । पायथन 2 - namedtuples
स्ट्रिंग विवरण से निर्मित - बदसूरत, खराब और "स्ट्रिंग लिटरल्स के अंदर प्रोग्रामिंग" बेवकूफ है।
मैं दो वर्तमान उत्तरों से सहमत हूं ("कुछ और का उपयोग करने पर विचार करें, लेकिन पाइलिंट हमेशा सही नहीं होता है" - स्वीकृत एक, और "पाइलिंट दबाने वाली टिप्पणी का उपयोग करें"), लेकिन मेरा अपना सुझाव है।
मुझे इसे एक बार और इंगित करने दें: कुछ कक्षाएं केवल डेटा स्टोर करने के लिए होती हैं।
अब विकल्प पर भी विचार करें - उपयोग property
-ज।
class MyClass(object):
def __init__(self, foo, bar):
self._foo = foo
self._bar = bar
@property
def foo(self):
return self._foo
@property
def bar(self):
return self._bar
ऊपर आपके पास केवल-पढ़ने के लिए गुण हैं, जो मान ऑब्जेक्ट के लिए ठीक है (जैसे कि डोमेन ड्रिवेन डिज़ाइन में), लेकिन आप सेटर भी प्रदान कर सकते हैं - इस तरह आपकी कक्षा उन क्षेत्रों की ज़िम्मेदारी ले सकेगी जो आपके पास हैं - उदाहरण के लिए कुछ सत्यापन करने के लिए आदि (यदि आपके पास बसने वाले हैं, तो आप उन्हें कंस्ट्रक्टर में उपयोग कर सकते हैं, अर्थात self.foo = foo
प्रत्यक्ष के बजाय self._foo = foo
, लेकिन सावधानी से, बसने वाले अन्य क्षेत्रों को पहले से ही आरंभिक मान सकते हैं, और फिर आपको निर्माणकर्ता में कस्टम सत्यापन की आवश्यकता होगी) ।