मैं एक कस्टम वर्ग लिखना चाहता हूं जो ऐसा व्यवहार करता है dict- इसलिए, मुझे विरासत में मिला है dict।
मेरा प्रश्न, हालांकि, यह है: क्या मुझे dictअपनी __init__()विधि में एक निजी सदस्य बनाने की आवश्यकता है ? मैं इस बात को नहीं देखता, क्योंकि मेरे पास पहले से ही dictव्यवहार है अगर मुझे बस विरासत में मिला है dict।
क्या कोई इंगित कर सकता है कि अधिकांश विरासत वाले स्निपेट नीचे के समान क्यों दिखते हैं?
class CustomDictOne(dict):
def __init__(self):
self._mydict = {}
# other methods follow
सरल के बजाय ...
class CustomDictTwo(dict):
def __init__(self):
# initialize my other stuff here ...
# other methods follow
वास्तव में, मुझे लगता है कि मुझे इस सवाल का जवाब देने में संदेह है कि उपयोगकर्ता सीधे आपके शब्दकोश तक नहीं पहुंच सकते (यानी उन्हें आपके द्वारा प्रदान की गई एक्सेस विधियों का उपयोग करना होगा)।
हालांकि, ऐरे एक्सेस ऑपरेटर के बारे में क्या []? कोई इसे कैसे लागू करेगा? अब तक, मैंने एक उदाहरण नहीं देखा है जो दिखाता है कि []ऑपरेटर को कैसे ओवरराइड करना है।
इसलिए यदि []कस्टम क्लास में एक्सेस फंक्शन नहीं दिया गया है, तो वंशानुगत आधार विधियाँ एक अलग शब्दकोष पर संचालित होंगी?
मैंने पायथन वंशानुक्रम की मेरी समझ का परीक्षण करने के लिए निम्नलिखित स्निपेट की कोशिश की:
class myDict(dict):
def __init__(self):
self._dict = {}
def add(self, id, val):
self._dict[id] = val
md = myDict()
md.add('id', 123)
print md[id]
मुझे निम्नलिखित त्रुटि मिली:
KeyError: <बिल्ट-इन फंक्शन आईडी>
ऊपर दिए गए कोड में क्या गलत है?
मैं कक्षा को कैसे सही करूं myDictताकि मैं इस तरह कोड लिख सकूं?
md = myDict()
md['id'] = 123
[संपादित करें]
मैंने अपनी डेस्क से धराशायी होने से पहले की गई मूर्खतापूर्ण त्रुटि से छुटकारा पाने के लिए ऊपर दिए गए कोड नमूने को संपादित किया है। यह एक टाइपो था (मुझे इसे त्रुटि संदेश से देखा जाना चाहिए था)।
dict, तो आपकोsuperउदाहरण के लिए केवल निर्दिष्ट करने के बजाय ऑब्जेक्ट (स्वयं का उपयोग करना ) का उपयोग करना चाहिए__dict__- जिसका अनिवार्य रूप से मतलब है कि आप हर उदाहरण के लिए दो dicts बना रहे हैं।