2012-03-28 4 views
32

में कमजोर संदर्भ मैं समझने की कोशिश कर रहा हूं कि पाइथन कमजोर संदर्भ सूची/शब्दकोश का काम कैसे करता है और इसके लिए प्रलेखन भी पढ़ रहा है, हालांकि मुझे यह पता लगाना प्रतीत नहीं होता कि वे कैसे काम करते हैं और उनका उपयोग किस प्रकार किया जा सकता है। क्या कोई मुझे एक बुनियादी उदाहरण दे सकता है कि वे क्या करते हैं/व्याख्या करते हैं कि वे कैसे काम करते हैं? इसकी बहुत सराहना की जाएगी।पायथन

(संपादित), थॉमस के कोड का उपयोग जब मैं obj स्थानापन्न [1,2,3] के लिए फेंक देता है:

Traceback (most recent call last): 
File "C:/Users/nonya/Desktop/test.py", line 9, in <module> 
r = weakref.ref(obj) 
TypeError: cannot create weak reference to 'list' object 

उत्तर

41

थ्योरी

संदर्भ गिनती आम तौर पर इस तरह के रूप में काम करता: हर बार जब आप एक वस्तु के लिए एक संदर्भ बनाने के लिए, यह एक की वृद्धि हुई है, और जब भी आप एक संदर्भ हटा सकते हैं, यह एक की कमी हुई है।

कमजोर संदर्भ आपको उस ऑब्जेक्ट के संदर्भ बनाने की अनुमति देते हैं जो संदर्भ गणना में वृद्धि नहीं करेगा।

संदर्भ गणना का उपयोग पाइथन के कचरा कलेक्टर द्वारा किया जाता है जब यह चलता है: किसी भी वस्तु जिसका संदर्भ गणना 0 कचरा एकत्र किया जाएगा।

आप महंगा वस्तुओं के लिए कमजोर संदर्भों का उपयोग करेंगे, या सर्कल संदर्भों से बचने के लिए (हालांकि कचरा कलेक्टर आमतौर पर इसे स्वयं करता है)।

प्रयोग

यहाँ एक काम कर उदाहरण उनके उपयोग का प्रदर्शन है:

import weakref 
import gc 

class MyObject(object): 
    def my_method(self): 
     print 'my_method was called!' 

obj = MyObject() 
r = weakref.ref(obj) 

gc.collect() 
assert r() is obj #r() allows you to access the object referenced: it's there. 

obj = 1 #Let's change what obj references to 
gc.collect() 
assert r() is None #There is no object left: it was gc'ed. 
+0

यह सूची/शब्दकोश के काम पर कैसे काम करता है, यह कक्षाओं/कार्यों पर एक महान उदाहरण था। :) –

+0

क्या आप कृपया मेरे संपादन को देख सकते हैं। जब किसी सूची या शब्दकोश को प्रतिस्थापित करना उस त्रुटि को फेंकता है। –

+0

मेरा बुरा, मैंने इसे पूरी तरह से अनदेखा किया है, आप वास्तव में 'सूची' या किसी अन्य समग्र प्रकार के लिए कमजोर नहीं बना सकते हैं - आपका सटीक उद्देश्य क्या है जिसके लिए आपको इसकी आवश्यकता होगी? –

9

मुद्दा यह है कि वे संदर्भ उन्हें किया जा रहा कचरा एकत्र करने से रोकने के बिना वस्तुओं के लिए बनाए रखा जा करने की अनुमति है।

दो मुख्य कारणों से आप यह क्यों चाहते हैं जहां आप अपना आवधिक संसाधन प्रबंधन करते हैं, उदा। बंद फाइलें, लेकिन क्योंकि इस तरह के पास के बीच का समय लंबा हो सकता है, कचरा कलेक्टर यह आपके लिए कर सकता है; या जहां आप कोई ऑब्जेक्ट बनाते हैं, और यह प्रोग्राम में कहां है, यह ट्रैक करने के लिए अपेक्षाकृत महंगा हो सकता है, लेकिन आप अभी भी ऐसे उदाहरणों से निपटना चाहते हैं जो वास्तव में मौजूद हैं।

दूसरा मामला शायद अधिक आम है - यह उचित है जब आप होल्डिंग कर रहे हों। सूचित करने के लिए वस्तुओं की एक सूची, और आप अधिसूचना प्रणाली कचरा संग्रह को रोकने के लिए नहीं चाहते हैं।

+0

शायद 3 कारण? चक्रवात संदर्भों से तीसरा तोड़ना। – dashesy

+1

@dashesy यह सही है। कमजोर संदर्भों के लिए सबसे आम (_arguably, केवल सुरक्षित_) उपयोग केस स्पष्ट रूप से संदर्भ चक्र तोड़ना है। यद्यपि पाइथन कचरा कलेक्टर वैसे भी ऐसे चक्रों को तोड़ सकता है, वैसे भी यह काफी कम जगह है- और इस तरह के चक्रों को पहले स्थान पर बनाने से रोकने के लिए समय-गहन है। कमजोर संदर्भों के सभी अन्य उपयोग सबसे अच्छे हैं और इन्हें डर और सम्मान के साथ व्यवहार किया जाना चाहिए। –

12

बस का कहना है कि weakref.ref निर्मित सूची के लिए काम नहीं करता है चाहता हूँ क्योंकि वहाँ की __slots__ में कोई __weakref__ सूची। उदाहरण के लिए, निम्न कोड एक सूची कंटेनर को परिभाषित करता है जो कमजोर का समर्थन करता है।

import weakref 

class weaklist(list): 
    __slots__ = '__weakref__', 

l = weaklist() 
r = weakref.ref(l) 

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

  • कोई संबंधित समस्या नहीं^_^