2014-04-23 5 views
21

पर __dict __() ओवरलोडिंग I12 एक वर्ग है जहां मैं ऑब्जेक्ट को एक शब्दकोश के रूप में वापस प्राप्त करना चाहता हूं, इसलिए मैंने इसे __dict__() में कार्यान्वित किया। क्या ये सही है?पायथन कक्षा

मुझे लगा कि एक बार मैंने ऐसा किया था, तो मैं dict (कस्टम ऑब्जेक्ट) का उपयोग कर सकता हूं, और ऑब्जेक्ट को एक शब्दकोश के रूप में वापस ले सकता हूं, लेकिन यह काम नहीं करता है।

क्या आपको __dict__() अधिभारित करना चाहिए? आप इसे कैसे बना सकते हैं ताकि कस्टम ऑब्जेक्ट को dict() का उपयोग करके एक शब्दकोश में परिवर्तित किया जा सके?

उत्तर

23

__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() या तो समझते हैं और एक नया करने के लिए कुंजी और मूल्यों की नक़ल की शब्दकोश वस्तु। यह थोड़ा और काम है, लेकिन यदि आप अपनी कस्टम कक्षा को हर जगह मैपिंग की तरह कार्य करना चाहते हैं तो इसके लायक हो सकते हैं।

+0

तार्किक लगता है, इसलिए यदि आप __iter__ के लिए जानकारी का एक चयन सेट पास करना चाहते हैं तो क्या आप उपज के बजाय {"var1": "val1", ... "varn": "valn"} का उपयोग कर सकते हैं? –

+0

@ josh1234: नहीं, '__iter__' * * एक पुनरावर्तक वापस करना होगा; एक शब्दकोश खुद ही एक इटेटरेटर नहीं है। –

+0

@ josh1234: और आपको कुंजी-मूल्य जोड़े के अनुक्रम का उत्पादन करना होगा। तो 'iter (somedictionary.items()) 'ठीक है, लेकिन सीधे' somedictionary' नहीं। –

22

सं। __dict__ आत्मनिरीक्षण के लिए उपयोग की जाने वाली एक विधि है - यह ऑब्जेक्ट गुण देता है। आप जो चाहते हैं वह एक नई नई विधि है, इसे as_dict पर कॉल करें, उदाहरण के लिए - यह सम्मेलन है। यहां समझने की बात यह है कि dict वस्तुओं को dict कन्स्ट्रक्टर के साथ जरूरी बनाने की आवश्यकता नहीं है।

+4

मैं सबसे अधिक वोट देने पर यह उत्तर पसंद करता हूं। यह जानना अच्छा लगता है कि 'dict' कैसे काम करता है, लेकिन ऑब्जेक्ट से एक नियम प्राप्त करने के लिए '__iter__' को ओवरराइड करना मेरे लिए थोड़ा हैकी दिखता है। इसमें कुछ अनजान रैमिकेशंस भी हो सकते हैं। –

संबंधित मुद्दे