2010-04-14 18 views
11
class attrdict(dict): 
    def __init__(self, *args, **kwargs): 
     dict.__init__(self, *args, **kwargs) 
     self.__dict__ = self 

a = attrdict(x=1, y=2) 
print a.x, a.y 

b = attrdict() 
b.x, b.y = 1, 2 
print b.x, b.y 

क्या कोई शब्द में पहली चार पंक्तियों को समझा सकता है? मैंने कक्षाओं और विधियों के बारे में पढ़ा। लेकिन यहां यह बहुत भ्रमित लगता है।वर्ग, dict, self, init, args?

The Dynamic dict

attrdict वर्ग का शोषण करने वाली है कि एक शब्दकोश से इनहेरिट और फिर वस्तु के __dict__ कि शब्दकोश में सेट करके:

+0

यह स्मृति को रिसाव करने का एक अच्छा तरीका है। स्पष्टीकरण के लिए http://bugs.python.org/issue1469629 देखें, और एक बेहतर विकल्प। –

उत्तर

5

आप अपने उदाहरण में स्थितित्मक तर्क का उपयोग नहीं कर रहे हैं। तो प्रासंगिक कोड है:

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 कॉल कर सकते हैं।

आशा बहुत गन्दा नहीं है।

+0

स्वीकार किए गए एक से बेहतर है। – Musaffa

4

यहाँ एक अच्छा लेख है कि __dict__ बताते है। इसलिए अभिभावक शब्दकोश के विरुद्ध कोई भी विशेषता पहुंच होती है (यानी dict कक्षा जो इसे प्राप्त करती है)।

लेख के बाकी भी समझ पायथन वस्तुओं के लिए काफी अच्छा है:

Python Attributes and Methods

7

एक पंक्ति-दर-पंक्ति स्पष्टीकरण पर मेरे शॉट:

class attrdict(dict): 

यह पंक्ति एक वर्ग की घोषणा अंतर्निहित dict वर्ग के उप-वर्ग के रूप में अभियोग।

def __init__(self, *args, **kwargs): 
    dict.__init__(self, *args, **kwargs) 

यह आपका मानक __init__ विधि है। dict.__init__(...) पर कॉल सुपर कक्षा '(इस मामले में, dict) कन्स्ट्रक्टर (__init__) विधि का उपयोग करना है।

अंतिम पंक्ति, self.__dict__ = self बनाता है यह तो कीवर्ड-तर्कों (kwargs) आप __init__ विधि को पारित विशेषताओं, जैसे कि, a.x, नीचे दिए गए कोड में a.y तरह पहुँचा जा सकता है।

आशा है कि इससे आपके भ्रम को दूर करने में मदद मिलेगी।

+0

'__init__' को ठीक करने की आवश्यकता है। उनके चारों ओर बैकटिक्स रखो, और वे मेरे '__init__' की तरह दिखेगा। –

+0

यह बहुत मदद करता है। धन्यवाद! – kame

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