दिलचस्प पोस्ट
मैं स्ट्रिंग में एक बैकस्लैश (\) कैसे लिखूं? एक स्थापित एनपीएम पैकेज का संस्करण खोजें डीबग और रिलीज़ बिल्ड के बीच प्रदर्शन अंतर एक कस्टम क्लास सूची को व्यवस्थित करें <T> एक विशिष्ट एप्लिकेशन का एक स्क्रीनशॉट प्राप्त करें URL से डाउनलोड / स्ट्रीम फ़ाइल – asp.net एक स्ट्रिंग के भीतर URL खोजने के लिए नियमित अभिव्यक्ति विक्रेता-विशिष्ट छद्म तत्वों / वर्गों को एक नियम सेट में जोड़ना संभव क्यों नहीं है? JSON.stringify () IE 8 द्वारा समर्थित है? jQuery AJAX क्वेरी से मेरे JSON को पार्स नहीं करेगा कैसे popen stdin को नियंत्रित करने के लिए, stdout, stderr पुनर्निर्देशन? कैसे एक फोन कॉल प्रोग्राम के लिए? डेटा विशेषता द्वारा तत्व का चयन करना सरणी की सभी सामग्री को सी # में प्रिंट करना प्रत्येक अच्छे डाटाबेस / एसक्यूएल डेवलपर को उत्तर देने में सक्षम होना चाहिए

अजगर बाध्य और अनबाउंड विधि ऑब्जेक्ट

मैंने बाध्य और अनबाउंड विधियों के बारे में कुछ कोड की कोशिश की है। जब हम उन्हें फोन करते हैं, तो मुझे लगता है कि दोनों ही वस्तुएं वापस लौटेंगी। लेकिन जब मैं कुछ जानकारी प्राप्त करने के लिए id() उपयोग करता हूं, तो वह कुछ देता है जो मुझे समझ में नहीं आ रहा है।

आईडीई: ग्रहण प्लगइन: पायदेव

 Class C(object): def foo(self): pass cobj = C() print id(C.foo) #1 print id(cobj.foo) #2 a = C.foo b = cobj.foo print id(a) #3 print id(b) #4 

और आउटपुट है ..

 5671672 5671672 5671672 5669368 

क्यों # 1 और # 2 एक ही आईडी लौटते हैं, वे अलग-अलग ऑब्जेक्ट नहीं हैं? और अगर हम C.foo चर और conj.foo को दो चर में निर्दिष्ट करते हैं, तो # 3 और # 4 विभिन्न आईडी वापस लौटाते हैं

मुझे लगता है कि # 3 और # 4 से पता चलता है कि वे वही वस्तु नहीं हैं, लेकिन # 1 और # 2 …

बद्ध विधि के आईडी और एक अनबाउंड विधि के बीच अंतर क्या है?

वेब के समाधान से एकत्रित समाधान "अजगर बाध्य और अनबाउंड विधि ऑब्जेक्ट"

जब भी आप class.name या instance.name माध्यम से कोई विधि class.name , तो विधि ऑब्जेक्ट को एक नया बनाया जाता है। पायथन हर बार एक विधि ऑब्जेक्ट में समारोह को लपेटने के लिए डिस्क्रिप्टर प्रोटोकॉल का उपयोग करता है

इसलिए, जब आप id(C.foo) , तो एक नई विधि ऑब्जेक्ट बनाई जाती है, आप इसे आईडी (एक मेमोरी एड्रेस) प्राप्त करते हैं, फिर विधि ऑब्जेक्ट को फिर से त्यागते हैं । तब आप id(cobj.foo) , एक नई विधि ऑब्जेक्ट बनाई गई है जो अब मुक्त स्मृति पते का पुन: उपयोग करता है और आप समान मूल्य देखते हैं। विधि तब, फिर से, त्याग की जाती है (संदर्भ संख्या के रूप में संग्रहित कचरा 0 से गिरता है)।

इसके बाद, आपने एक चर में C.foo अनबाउंड विधि के लिए एक संदर्भ संग्रहीत किया। अब मेमोरी एड्रेस मुक्त नहीं है (संदर्भ संख्या 1 के बजाय 1 है), और आप cobj.foo को cobj.foo एक दूसरी विधि का उदाहरण cobj.foo जिसमें एक नई मेमोरी स्थान का उपयोग करना है। इस प्रकार आपको दो भिन्न मूल्य मिलते हैं

id() लिए दस्तावेज़ीकरण देखें:

एक वस्तु की "पहचान" लौटें यह एक पूर्णांक (या लंबी पूर्णांक) है जो अपने जीवनकाल के दौरान इस वस्तु के लिए अद्वितीय और स्थिर होने की गारंटी है। गैर-अतिव्यापी जन्मों वाले दो ऑब्जेक्ट्स में समान id() वैल्यू हो सकती है

CPython कार्यान्वयन विवरण : यह स्मृति में ऑब्जेक्ट का पता है

जोर मेरा

आप कक्षा के __dict__ विशेषता के माध्यम से फ़ंक्शन के सीधे संदर्भ का उपयोग करके एक विधि को फिर से बना सकते हैं, फिर __get__ डिस्क्रिप्टर विधि को बुला सकते हैं:

 >>> class C(object): ... def foo(self): ... pass ... >>> C.foo <unbound method C.foo> >>> C.__dict__['foo'] <function foo at 0x1088cc488> >>> C.__dict__['foo'].__get__(None, C) <unbound method C.foo> >>> C.__dict__['foo'].__get__(C(), C) <bound method C.foo of <__main__.C object at 0x1088d6f90>> 

ध्यान दें कि पायथन 3 में, संपूर्ण अनबाउंड / बाध्य विधि भेद हटा दिया गया है; आप एक समारोह प्राप्त करते हैं, जहां से पहले आप एक अनबाउंड विधि प्राप्त करते हैं, और एक विधि अन्यथा, जहां एक विधि हमेशा बद्ध है:

 >>> C.foo <function C.foo at 0x10bc48dd0> >>> C.foo.__get__(None, C) <function C.foo at 0x10bc48dd0> >>> C.foo.__get__(C(), C) <bound method C.foo of <__main__.C object at 0x10bc65150>> 

@ मार्टिजन पीटर का बहुत अच्छा जवाब जोड़ना:

 In [140]: class C(object): def foo(self): pass .....: In [141]: c=C() In [142]: id(c.foo),id(C.foo) Out[142]: (149751844, 149751844) #so 149751844 is current free memory address In [143]: a=c.foo #now 149751844 is assigned to a In [144]: id(a) Out[144]: 149751844 #now python will allocate some different address to c.foo and C.foo In [145]: id(c.foo),id(C.foo) # different address used this time,and # that address is freed after this step Out[145]: (149752284, 149752284) #now 149752284 is again free, as it was not allocated to any variable In [146]: b=C.foo #now 149752284 is allocated to b In [147]: id(b) Out[147]: 149752284 In [148]: c.foo is C.foo #better use `is` to compare objects, rather than id() Out[148]: False