2011-02-16 11 views
5

यहां वह पैटर्न है जिसका मैं उपयोग करने के बारे में सोच रहा हूं:क्या इस पायथन पैटर्न के साथ कोई 'गॉथचास' है?

class Dicty(dict): 
    def __init__(self): 
     self.__dict__ = self 

d = Dicty() 
d.foo = 'bar' 
print d['foo'] 
>>> bar 
d['foo'] = 'baz' 
print d.foo 
>>> 'baz' 

आम तौर पर, मैं ऑब्जेक्ट विशेषता एक्सेस के अर्थशास्त्र को एक्सेस प्राप्त/सेट एक्सेस पर पसंद करता हूं, लेकिन कुछ परिस्थितियां हैं जहां dict-like access की आवश्यकता होती है (उदाहरण के लिए , d['foo-bar'] = 'baz') और मैं इन मामलों के लिए विशेष गेटर सेटर विधियों को नहीं रखना चाहूंगा, इसलिए साझा किए गए गुणों के साथ एक ही समय में dict & ऑब्जेक्ट का दोहरा व्यवहार।

क्या उपरोक्त पैटर्न के साथ कोई गठिया है?

+1

देखें: http://stackoverflow.com/questions/3031219/python-recursively-access-dict-via-attributes-as-well-as-index-access –

+1

'इंस्टेंसेंस (dict, ऑब्जेक्ट)'। आपको 'ऑब्जेक्ट' से उत्तराधिकारी की आवश्यकता नहीं है। और कार्यान्वयन हैकी से अधिक है। इसके अलावा: संभव डुप्लिकेट [पायथन में एक विशेषता की तरह dict कुंजी तक पहुंचने?] (Http://stackoverflow.com/questions/4984647/accessing-dict-keys-like-an-attribute-in-python) – delnan

+1

इस में बनाए गए ऑब्जेक्ट्स बिना किसी समस्या के मसालेदार तरीके से उठाया जा सकता है लेकिन स्वीकार किए गए उत्तर द्वारा सुझाए गए शैली में बनाए गए ऑब्जेक्ट्स नहीं कर सकते हैं। –

उत्तर

6

यहाँ एक कम "hacky" जिस तरह से एक ही प्रभाव को प्राप्त करने के लिए बुद्धिमान, और कुछ सवाल उठाने के लिए बाध्य है अगर कोई और आपके कोड को पढ़ता है।

+4

आपको 'KeyError' को पकड़ना और अनुवाद करना चाहिए - '__getattr__' को' AttributeError 'फेंकना है। –

+2

यदि आप ऐसा करने जा रहे हैं, तो बस '__getattr__ = __getitem__' और '__setattr__ = __setitem__' करना बेहतर होगा। सरल, और एक कम समारोह कॉल। – kindall

+0

@kindall @PiotrLegnica: आप दोनों उत्कृष्ट (हालांकि परस्पर अनन्य) अंक बनाते हैं! धन्यवाद! :) – shang

3

self.__dict__ सेट न करें। सुपरक्लास पर __init__(self, *args, **kwargs) पर कॉल करें। इसके अलावा, dictobject से विरासत प्राप्त करता है, इसलिए आपको इसे निर्दिष्ट करने की आवश्यकता नहीं है।

class Dicty(dict): 
    def __getattr__(self, key): 
     return self[key] 

    def __setattr__(self, key, value): 
     self[key] = value

मैं कि अपने रास्ते के साथ-साथ अच्छा काम करेगा लगता है , लेकिन __dict__ विशेषता है जो की तरह स्थापित करने के लिए थोड़ा iffy style- लगता है:

2

कुछ चीजें। एक यह है कि यदि आप keys जैसे किसी शब्दकोश विधि का प्रयास और उपयोग करते हैं, तो आप इसे अभी प्राप्त नहीं कर पाएंगे। कुछ अन्य मुद्दे थे जिनमें मैंने भाग लिया, जैसे कि अचार-सक्षम और प्रति-सक्षम।

लेकिन मैंने कुछ ऐसा लागू किया है जो बिना किसी समस्या के करता है। आप इसे यहां देख सकते हैं, यह dictlib.py module में AttrDict क्लास है। उस मॉड्यूल में एक कक्षा भी होती है जो एक और मैपिंग स्टाइल ऑब्जेक्ट को लपेट सकती है, ऐसे मामलों में जहां इसे उपclassed नहीं किया जा सकता है।

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