वैश्विकों को कोई नहीं पर सेट करने से उनकी सफाई होती है। स्थानीय लोग सत्र के अंत में स्वयं को नष्ट कर देते हैं। फ़ंक्शन __del__ जिसे पायथन द्वारा बुलाया जाता है, ग्लोबल्स को कोई नहीं पर सेट करता है।
निम्न कोड पर विचार करें जहां दिए गए वर्ग में सभी वस्तुओं की सफाई है -
उदाहरण
class Counter: Count = 0 # This is the count of objects of this class def __init__(self, name): self.name = name print name, 'created' Counter.Count += 1 def __del__(self): print self.name, 'deleted' Counter.Count -= 1 if Counter.Count == 0: print 'Last Counter object deleted' else: print Counter.Count, 'Counter objects remaining' x = Counter("First") del x
अंतिम डेल के बिना, आपको एक अपवाद मिलता है।
पायथन डॉक्स से __del__ के बारे में -
चेतावनी:अनिश्चित परिस्थितियों के कारण __del__() विधियों को लागू किया जाता है, उनके निष्पादन के दौरान होने वाले अपवादों को अनदेखा कर दिया जाता है, और इसके बजाय sys.stderr पर एक चेतावनी मुद्रित की जाती है। साथ ही, जब __del__() मॉड्यूल को हटाए जाने के जवाब में लागू किया जाता है (उदाहरण के लिए, जब प्रोग्राम का निष्पादन किया जाता है), __del__() विधि द्वारा संदर्भित अन्य ग्लोबल्स पहले ही हटा दिए जा सकते हैं। इस कारण से, __del__() विधियों को बाहरी इनवेरिएंट को बनाए रखने के लिए आवश्यक न्यूनतम न्यूनतम कार्य करना चाहिए।
डेल को स्पष्ट कॉल के बिना, __del__ केवल कार्यक्रम के अंत में बुलाया जाता है, काउंटर और/या गणना पहले से ही जीसी-एड हो सकती है जब तक कि __del__ को कॉल नहीं किया जाता है (जिस क्रम में वस्तुओं को एकत्र किया जाता है वह नियतात्मक नहीं है)। अपवाद का अर्थ है कि काउंटर पहले ही एकत्र किया जा चुका है। आप __del__ के साथ विशेष रूप से फैंसी कुछ भी नहीं कर सकते।
यहां दो संभावित समाधान हैं।
-
फ़ाइल ऑब्जेक्ट के लिए एक स्पष्ट फ़ाइनलाइज़र विधि का उपयोग करें, जैसे क्लोज़()।
-
कमजोर संदर्भों का प्रयोग करें।