__dict__
पायथन वस्तुओं पर एक विशेष विधि नहीं है। इसका उपयोग विशेषता शब्दकोश के लिए किया जाता है; dict()
इसका कभी भी उपयोग नहीं करता है।
इसके बजाय, आप पुनरावृत्ति का समर्थन कर सकते हैं; जब dict()
को iterable पारित किया गया है जो कुंजी-मान जोड़े उत्पन्न करता है, तो उन कुंजी-मूल्य जोड़े के साथ एक नई शब्दकोश वस्तु उत्पन्न होती है।
आप __iter__
विधि को लागू करके एक पुनरावृत्ति प्रदान कर सकते हैं, जो iterator वापस कर देना चाहिए। एक जनरेटर समारोह के रूप में है कि विधि को लागू पर्याप्त होता:
class Foo(object):
def __init__(self, *values):
self.some_sequence = values
def __iter__(self):
for key in self.some_sequence:
yield (key, 'Value for {}'.format(key))
डेमो:
>>> class Foo(object):
... def __init__(self, *values):
... self.some_sequence = values
... def __iter__(self):
... for key in self.some_sequence:
... yield (key, 'Value for {}'.format(key))
...
>>> f = Foo('bar', 'baz', 'eggs', 'ham')
>>> dict(f)
{'baz': 'Value for baz', 'eggs': 'Value for eggs', 'bar': 'Value for bar', 'ham': 'Value for ham'}
तुम भी dict
उपवर्ग सकता है, या लागू Mapping abstract class, और dict()
या तो समझते हैं और एक नया करने के लिए कुंजी और मूल्यों की नक़ल की शब्दकोश वस्तु। यह थोड़ा और काम है, लेकिन यदि आप अपनी कस्टम कक्षा को हर जगह मैपिंग की तरह कार्य करना चाहते हैं तो इसके लायक हो सकते हैं।
स्रोत
2014-04-23 18:30:00
तार्किक लगता है, इसलिए यदि आप __iter__ के लिए जानकारी का एक चयन सेट पास करना चाहते हैं तो क्या आप उपज के बजाय {"var1": "val1", ... "varn": "valn"} का उपयोग कर सकते हैं? –
@ josh1234: नहीं, '__iter__' * * एक पुनरावर्तक वापस करना होगा; एक शब्दकोश खुद ही एक इटेटरेटर नहीं है। –
@ josh1234: और आपको कुंजी-मूल्य जोड़े के अनुक्रम का उत्पादन करना होगा। तो 'iter (somedictionary.items()) 'ठीक है, लेकिन सीधे' somedictionary' नहीं। –