__del__एक फाइनल है । यह तब कहा जाता है जब किसी वस्तु को कचरा एकत्र किया जाता है जो किसी बिंदु पर तब होता है जब ऑब्जेक्ट के सभी संदर्भ हटा दिए जाते हैं।
एक साधारण मामले में यह सही हो सकता है जब आप कहते हैं del xया, यदि xफ़ंक्शन समाप्त होने के बाद, एक स्थानीय चर है। विशेष रूप से, जब तक कि परिपत्र संदर्भ नहीं होते हैं, तब तक CPython (मानक पायथन कार्यान्वयन) तुरंत कचरा इकट्ठा करेगा।
हालाँकि, यह CPython का कार्यान्वयन विवरण है। पायथन कचरा संग्रहण की एकमात्र आवश्यक संपत्ति यह है कि यह सभी संदर्भों को हटाए जाने के बाद होता है, इसलिए यह आवश्यक नहीं हो सकता है कि ठीक बाद में हो और ऐसा बिल्कुल न हो ।
इससे भी अधिक, चर कई कारणों से लंबे समय तक रह सकते हैं , जैसे कि एक प्रचार अपवाद या मॉड्यूल आत्मनिरीक्षण चर संदर्भ गणना को 0. से अधिक रख सकता है। इसके अलावा, चर संदर्भों के चक्र का एक हिस्सा हो सकता है - कचरे के संग्रह के साथ सीपीथॉन सबसे अधिक बार टूट जाता है , लेकिन सभी नहीं, इस तरह के चक्र, और फिर भी केवल समय-समय पर।
चूंकि आपके पास कोई गारंटी नहीं है कि इसे निष्पादित किया गया है, इसलिए किसी को उस कोड को कभी भी नहीं रखना चाहिए जिसे आपको चलाने की आवश्यकता है __del__()- इसके बजाय, यह कोड ब्लॉक finallyके tryखंड या एक संदर्भ प्रबंधक के withबयान में आता है। हालाँकि, इसके लिए वैध उपयोग के मामले हैं __del__: उदाहरण के लिए यदि कोई ऑब्जेक्ट Xसंदर्भ Yऔर Yएक वैश्विक cache( cache['X -> Y'] = Y) में संदर्भ की एक प्रति भी रखता है, तो X.__del__कैश प्रविष्टि को हटाने के लिए भी विनम्र होगा ।
यदि आप जानते हैं कि विध्वंसक एक आवश्यक सफाई प्रदान करता है (उपरोक्त दिशानिर्देश के उल्लंघन में), तो आप इसे सीधे कॉल करना चाह सकते हैं , क्योंकि विधि के रूप में इसके बारे में कुछ खास नहीं है x.__del__():। जाहिर है, आपको ऐसा तभी करना चाहिए जब आपको पता हो कि दो बार फोन करने का मन नहीं करता। या, एक अंतिम उपाय के रूप में, आप इस पद्धति का उपयोग करके इसे फिर से परिभाषित कर सकते हैं
type(x).__del__ = my_safe_cleanup_method