दिलचस्प पोस्ट
Xcode फिर से डाउनलोड किए बिना कैसे आईफोन एसडीके को अपडेट करें? किसी ऑब्जेक्ट को स्ट्रिंग में सीरियल करें बोवर (और एनएमएम) संस्करण वाक्यविन्यास क्या है? परिसंपत्ति txt फ़ाइल के लिए Android पथ टेस्टिंग टेक्स्ट () XPath में नोड्स बनाम स्ट्रिंग मान जावा में पुरातन के दो सरणियों की तुलना करें? .NET कोर आरसी 2 में .exe फ़ाइल बनाएं मुझे एक संग्रहीत प्रक्रिया में एक टेबल नाम कैसे पार करना चाहिए? एक subsetted डेटा फ्रेम में कारक स्तर ड्रॉप बंदरगाह मानचित्रण के बिना डॉकर कंटेनर की आईपी और पोर्ट को बाहरी डॉकर्स होस्ट को कैसे उजागर करें? HTML फॉर्म से सर्वलेट वर्ग को कैसे कॉल करें पाइथन असाइनमेंट ऑपरेटर के साथ अल्पविराम का उपयोग करने और अंडरस्कोर का अर्थ क्या है? एक कस्टम बनाने का सही तरीका क्या है। NET अपवाद सीरिजलाजनीय है? मैं MySQL का समय क्षेत्र कैसे सेट करूं? सी # में GetHashCode दिशानिर्देश

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

मैंने बाध्य और अनबाउंड विधियों के बारे में कुछ कोड की कोशिश की है। जब हम उन्हें फोन करते हैं, तो मुझे लगता है कि दोनों ही वस्तुएं वापस लौटेंगी। लेकिन जब मैं कुछ जानकारी प्राप्त करने के लिए 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 …

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

Solutions Collecting From Web of "अजगर बाध्य और अनबाउंड विधि ऑब्जेक्ट"

जब भी आप 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