Weakref मॉड्यूल के लिए प्रलेखन के अनुसार:
निम्नलिखित में, शब्द दिग्दर्शन वस्तु जो एक कमजोर संदर्भ द्वारा में जाना जाता है का मतलब है। , जब एक दिग्दर्शन करने के लिए ही शेष संदर्भ कमजोर संदर्भ हैं कचरा संग्रह दिग्दर्शन को नष्ट करने और के लिए अपने स्मृति पुन: उपयोग के लिए स्वतंत्र है:
एक वस्तु को एक कमजोर संदर्भ वस्तु जीवित रखने के लिए पर्याप्त नहीं है कुछ और।
self.MyCallbackA = MyCallbackA
अब, अपने कोड में बाध्य विधि MyCallbackB लिए कोई सन्दर्भ नहीं है -
क्या MyCallbackA साथ हो रहा है कि आप एक के मामलों में यह करने के लिए एक संदर्भ के पकड़े हुए हैं, धन्यवाद करने के लिए है। यह केवल एक .__ वर्ग __.__ dict__ में एक अनबाउंड विधि के रूप में आयोजित किया जाता है। असल में, जब आप self.methodName करते हैं तो एक बाध्य विधि बनाई जाती है (और आपके पास वापस आती है)। (AFAIK, एक बाध्य विधि एक संपत्ति की तरह काम करती है - एक वर्णनकर्ता (केवल पढ़ने के लिए) का उपयोग करना: कम से कम नए स्टाइल कक्षाओं के लिए। मुझे यकीन है कि कुछ समान अर्थात् पुराने/ओएस वर्णक पुराने शैली वर्गों के लिए होता है। मैं इसे छोड़ दूंगा किसी और को पुरानी स्टाइल कक्षाओं के बारे में दावा सत्यापित करने के लिए अधिक अनुभवी।) तो, स्वयं। MyCallbackB जैसे ही कमजोर पड़ता है, मर जाता है, क्योंकि इसमें कोई मजबूत संदर्भ नहीं है!
मेरे निष्कर्ष पर आधारित होते हैं: -
import weakref
#Trace is called when the object is deleted! - see weakref docs.
def trace(x):
print "Del MycallbackB"
class A(object):
def __init__(self):
def MyCallbackA():
print 'MyCallbackA'
self.MyCallbackA = MyCallbackA
self._testA = weakref.proxy(self.MyCallbackA)
print "Create MyCallbackB"
# To fix it, do -
# self.MyCallbackB = self.MyCallBackB
# The name on the LHS could be anything, even foo!
self._testB = weakref.proxy(self.MyCallbackB, trace)
print "Done playing with MyCallbackB"
def MyCallbackB(self):
print 'MyCallbackB'
def test_a(self):
self._testA()
def test_b(self):
self._testB()
if __name__ == '__main__':
a = A()
#print a.__class__.__dict__["MyCallbackB"]
a.test_a()
आउटपुट
बनाएं MyCallbackB
डेल MycallbackB
MyCallbackB
MyCallbackA
0 के साथ खेल हो गया
नोट:
मैंने पुरानी स्टाइल कक्षाओं के लिए इसे सत्यापित करने का प्रयास किया।
<method-wrapper '__get__' of instancemethod object at 0xb7d7ffcc>
दोनों नए और पुराने शैली कक्षाओं के लिए
- ऐसा नहीं है कि "प्रिंट a.test_a .__ get__" आउटपुट निकला। तो यह वास्तव में एक वर्णनकर्ता नहीं हो सकता है, बस कुछ वर्णनकर्ता की तरह। किसी भी मामले में, बिंदु यह है कि जब आप स्वयं के माध्यम से एक उदाहरण विधि acces करते हैं, और जब तक आप इसके लिए एक मजबूत संदर्भ बनाए रखते हैं, तो इसे हटा दिया जाएगा।
अजगर 3 '' आइटम .__ self__' – lou
आवश्यकता हो सकती है '' डीईएफ़ __eq __ (स्वयं, अन्य) के साथ 'साथ आइटम .__ func__' item.im_func' की जगह के लिए और' item.im_self': अन्य वापसी() == स्वयं() ''? क्या यह सबसे अच्छा तुलना पैटर्न है? (और शायद '' __ne__'' उलटा के रूप में) – Rafe