आप अपने उदाहरण में स्थितित्मक तर्क का उपयोग नहीं कर रहे हैं। तो प्रासंगिक कोड है:
class attrdict(dict):
def __init__(self, **kwargs):
dict.__init__(self, **kwargs)
self.__dict__ = self
पहली पंक्ति में आप dict
का एक उपवर्ग के रूप में वर्ग attrdict
परिभाषित करते हैं। दूसरी पंक्ति में आप उस फ़ंक्शन को परिभाषित करते हैं जो स्वचालित रूप से आपके इंस्टेंस को प्रारंभ करेगा। आप इस फ़ंक्शन में कीवर्ड तर्क (**kargs
) पास करते हैं। जब आप a
का दृष्टांत:
a = attrdict(x=1, y=2)
आप वास्तव में बुला रहे हैं
attrdict.__init__(a, {'x':1, 'y':2})
dict उदाहरण कोर प्रारंभ dict
निर्मित सुपर क्लास आरंभ किया जाता है। यह attrdict.__init__
में प्राप्त पैरामीटर को पारित करने वाली तीसरी पंक्ति में किया जाता है। इस प्रकार,
dict.__init__(self,{'x':1, 'y':2})
self
(उदाहरण a
) एक शब्दकोश बनाता है:
self == {'x':1, 'y':2}
अच्छी बात यह अंतिम पंक्ति में होता है: प्रत्येक उदाहरण के एक शब्दकोश उसके गुण धारण किया है। यह self.__dict__
है (यानी।a.__dict__
)।
उदाहरण के लिए
, अगर
a.__dict__ = {'x':1, 'y':2}
हम a.x
या a.y
लिखने और मूल्यों 1 या 2, क्रमशः मिल सकता है।
तो, यह क्या लाइन 4 करता है:
self.__dict__ = self
के बराबर है:
a.__dict__ = a where a = {'x':1, 'y':2}
तब मैं a.x
और a.y
कॉल कर सकते हैं।
आशा बहुत गन्दा नहीं है।
यह स्मृति को रिसाव करने का एक अच्छा तरीका है। स्पष्टीकरण के लिए http://bugs.python.org/issue1469629 देखें, और एक बेहतर विकल्प। –