2012-02-09 17 views
12

स्पाइडर IDE के साथ एक नया वर्ग कोडिंग, और अंतिम परिणाम की जाँच करने के pylint उपयोग करते समय, मैं त्रुटि संदेश में भाग लिया है की init__ में __dict__ के उपयोग (लेकिन त्रुटि के बिना उम्मीद के रूप में कोड काम)।pythonic: समारोह आत्म .__ एक वर्ग

संदर्भ: कन्स्ट्रक्टर फ़ंक्शन में, मैं नए सदस्य बनाना चाहता हूं (काफी कुछ)। आमतौर पर, इन पर्याप्त कुछ तो मैं इस कोडिंग का उपयोग कर रहे हैं:

class MyClass(): 
    def __init__(self): 
     self.a = ... 
     self.b = ... 

लेकिन कई सदस्यों के एक मामले में (10 मान लीजिए), एक ही प्रारंभिक मूल्य के लिए सभी सेट के साथ (चलो कहते हैं कि वे सब dict हैं())

class MyClass(): 
    def my_method(self): 
     print self.c 

त्रुटिसाथ:

class MyClass(): 
    def __init__(self): 
     _vars = ["a", "b", "c", ...] 
     for _var in _vars: 
      self.__dict__[_var] = dict() 
कक्षा में

इसके अलावा, मैं का उपयोग कर एक सदस्य के लिए बात कर रहा था:, मैं ऐसा करने के लिए परीक्षा की गई थी pylint (स्पाइडर में):

जब इस फाइल पर pylint का उपयोग कर, मैं एक त्रुटि संदेश कह रही है:

MyClass.my_method: 'MyClass' का उदाहरण नहीं है 'c'member ।

हालांकि, कोड त्रुटि के बिना ठीक है, यानी। मैं बिना किसी समस्या के सदस्य 'सी' तक पहुंच सकता हूं।

प्रश्न: क्या यह एक उचित कोडिंग है, या क्या मुझे सदस्यों को आरंभ करने के लिए ऐसी विधि से बचना चाहिए?

+2

मुझे यकीन है कि आप 'MyClass' के साथ क्या करने की कोशिश कर रहे हैं कि वास्तव में क्या नहीं कर रहा हूँ, लेकिन जैसे आप एक' collections.defaultdict में निवेश कर सकते हैं (यह लग रहा है) '। Http://docs.python.org/library/collections.html#collections.defaultdict देखें।अभी भी दिलचस्पी है कि अन्य लोगों को स्वयं को संशोधित करने के बारे में क्या कहना है .__ dict__, एक आवृत्ति चर बनाने के बजाय जो एक शब्दकोश होता है। – Noah

+0

@ नोहा धन्यवाद नोहा, मुझे डिफॉल्टडिक्ट क्लास नहीं पता था। यह वास्तव में दिलचस्प लगता है! अब मैं देख रहा हूं कि मैंने निश्चित रूप से मेरे कोड के लिए कुछ "टूल्स" कोड किए हैं, जो शायद कुछ बेहतर कोड किए गए पायथन मॉड्यूल में बनाए गए हैं (उदाहरण के लिए। मैंने एक साधारण चीज़ बनाई है जो डिफॉल्ट डिक्ट की तरह कुछ ऐसा लगता है, हालांकि बहुत कम जटिल)। बहुत बहुत धन्यवाद। – mhavel

उत्तर

16

हाँ, यह सीधे उदाहरण शब्दकोश अद्यतन करने के लिए उचित है। वैकल्पिक रूप से, आप चर अद्यतन करने के लिए setattr का उपयोग कर सकते हैं। मैंने उत्पादन कोड में उपयोग किए गए दोनों दृष्टिकोण देखे हैं।

setattr के साथ उदाहरण के शब्दकोश सीधे छूने की कोई जरूरत नहीं है:

class MyClass(): 
    def __init__(self): 
     for var in 'a', 'b', 'c': 
      setattr(self, var, dict()) 

लेकिन अगर आप उदाहरण के शब्दकोश सीधे अद्यतन करते हैं, वहाँ जोड़ी संभव सुधार पर विचार के लिए कर रहे हैं। उदाहरण के लिए, __dict__ के बजाय vars() का उपयोग करके थोड़ा अच्छा दिख रहा है। इसके अलावा, आप कीवर्ड तर्क के साथ dict.update विधि का उपयोग कर सकते हैं:

class MyClass(): 
    def __init__(self): 
     vars(self).update(a=dict(), b=dict(), c=dict()) 
+1

धन्यवाद रेमंड, आपका उत्तर वास्तव में स्पष्ट और सहायक है (कम से कम मेरे लिए)। ऐसा लगता है कि इस बिंदु पर मुझे कुछ पायथन पृष्ठभूमि याद आ रही है ... एक किताब में भी खोदना है :) – mhavel

5

यह वास्तव में ठीक है, लेकिन मुझे आमतौर पर __dict__ के साथ गड़बड़ से बचने की सलाह दी जाती है। क्या होगा, उदाहरण के लिए, आप सड़क के नीचे बाद में अपनी ऑब्जेक्ट की विशेषता के लिए कस्टम सेटर डालना चाहते हैं?

अपने उदाहरण मामले में, आप बस में लाइन बदल सकते अपने निम्नलिखित के साथ पाश के लिए:

setattr(self, _var, dict()) 
+0

धन्यवाद विल। यह कार्य वास्तव में इस मामले में आसान लगता है। मैं इसे आज़मा दूंगा। – mhavel

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