क्या किसी वस्तु के __dict__ को संशोधित करना उसके गुण पायथन को माना जाता है?


12

मेरे पास एक वर्ग है जो एक डेटाबेस (या एक अन्य स्रोत, उदाहरण के लिए MongoDB, एक CSV फ़ाइल, आदि) में मिली पंक्तियों से वस्तुओं को फुलाता है। ऑब्जेक्ट के गुणों को सेट करने के लिए, यह कुछ ऐसा करता है self.__dict__.update(**properties)या obj.__dict__.update(**properties)

क्या इसे पायथोनिक माना जाता है? क्या यह एक अच्छा पैटर्न है जिसे मुझे उपयोग करना जारी रखना चाहिए, या क्या इसे बुरा रूप माना जाता है?


1
मुझे नहीं पता कि यह पाइथोनिक है, लेकिन यह निश्चित रूप से डंडर इनिट में करना अधिक सामान्य है।
user16764

जवाबों:


10

पायथन 3.3 में, एक नया प्रकार जोड़ा गया था types.SimpleNamespace(), और प्रलेखन में यह इस प्रकार वर्णित है:

प्रकार लगभग निम्नलिखित कोड के बराबर है:

class SimpleNamespace:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
    def __repr__(self):
        keys = sorted(self.__dict__)
        items = ("{}={!r}".format(k, self.__dict__[k]) for k in keys)
        return "{}({})".format(type(self).__name__, ", ".join(items))

__init__प्रकार की विधि पर ध्यान दें ; पायथन डॉक्यूमेंटेशन की तुलना में आपको तकनीक का बेहतर समर्थन नहीं मिल सकता है।


हालाँकि SimpleNamespaceयह अधिकांश प्रकारों से काफी अलग है, लेकिन इसमें विशेषताओं का एक निश्चित सेट नहीं है।

7
खैर, docs.python.org/2/library/stdtypes.html से पायथन डॉक्यूमेंटेशन की बात करते हुए, "हर मॉड्यूल का एक विशेष गुण है __dict__। यह डिक्शनरी का सिंबल टेबल है। इस डिक्शनरी को संशोधित करने से वास्तव में मॉड्यूल का सिंबल बदल जाएगा। तालिका, लेकिन __dict__विशेषता के लिए प्रत्यक्ष असाइनमेंट संभव नहीं है (आप लिख सकते हैं m.__dict__['a'] = 1, जो m.a1 होना परिभाषित करता है, लेकिन आप नहीं कर सकते हैं writem.__dict__ = {}) सीधे संशोधित __dict__करने की अनुशंसा नहीं की जाती है , "जो कि शुरू में मुझे यह सवाल पूछने के लिए प्रेरित करता है।
skyler

@skyler: ध्यान दें कि केवल मॉड्यूल नेमस्पेस का उल्लेख है । globals()समारोह में एक ही नाम स्थान देता है, और वहाँ गतिशील चेतावनी वैश्विक स्थापना, इसलिए तुलना में समस्याओं को हल करने आमतौर पर बेहतर तरीके हैं।
मार्टिगन पीटरर्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.