2013-02-07 14 views
6

मैं सिर्फ पोस्ट How can I assign a new class attribute via __dict__ in python? पढ़ने और था @bruno desthuilliers से एक टिप्पणी करते हुए कहा है कि वहाँ गया था:setattr (वस्तु, नाम, मूल्य) वस्तु बनाम .__ setattr __ (नाम, मूल्य)

एक सीधे जादू नहीं बुलाना चाहिए विधियों - वे यहां ऑपरेटरों या जेनेरिक कार्यों के कार्यान्वयन के रूप में हैं। इस मामले में, idiomatic समाधान setattr(obj, name, value) का उपयोग करना है।

सेटैटर का मामला अपनी टिप्पणी के दायरे से बाहर दिखता है: ऑपरेटर नहीं, वास्तव में जेनेरिक फ़ंक्शन का कार्यान्वयन नहीं।

कोई टिप्पणी को समझा सकता है? मुझे दूसरे पर क्यों पसंद करना चाहिए?

किस मामले में obj.__setattr__(name, value) का उपयोग करना बेहतर है?

उत्तर

15

आपको हमेशा setattr() का उपयोग करना चाहिए, टिप्पणीकर्ता काफी सही है।

उदाहरण के लिए, __setattr__ लागू करने के लिए सभी प्रकार नहीं हैं, उदाहरण के लिए, setattr() सही ढंग से काम करेगा यदि प्रकार विशेषता को सेट करने की अनुमति देता है।

डबल-अंडरस्कोर विधियां हुक हैं, कस्टम कस्टम व्यवहार को लागू करने के लिए आपके कस्टम वर्ग सक्षम करने के लिए। पाइथन एपीआई अगर हुक गुम हो तो डिफ़ॉल्ट व्यवहार पर वापस आने के लिए मौजूद होने पर इन हुक का उपयोग करेगा। एपीआई को छोड़कर, आप अपने कोड में फॉलबैक को लागू करने के साथ खुद को बोझ कर रहे हैं।

def Foo(Bar): 
    def __setattr__(self, attr, value): 
     # do something with attr and value 
     super(Foo, self).__setattr__(attr, value) 
+0

महान जवाब @Martijn धन्यवाद:

आप केवल कभी __setattr__ सीधे कॉल करने के लिए जब super() कॉल के माध्यम से अधिमानतः एक उपवर्ग को लागू करने, और उसके बाद की जरूरत है –

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