मेरे पास एक आंतरिक डेटाबेस कनेक्शन वाला ऑब्जेक्ट है जो पूरे जीवनकाल में सक्रिय है। कार्यक्रम के अंत में, कनेक्शन को प्रतिबद्ध और बंद करना होगा। अब तक मैंने एक स्पष्ट close
विधि का उपयोग किया है, लेकिन यह कुछ हद तक बोझिल है, खासकर जब कॉलिंग कोड में अपवाद हो सकते हैं।ऑब्जेक्ट विनाश पर एक आंतरिक pysqlite कनेक्शन की सफाई
मैं बंद करने के लिए __del__
विधि का उपयोग करने पर विचार कर रहा हूं, लेकिन कुछ पढ़ने के बाद मुझे चिंता है। क्या यह एक वैध उपयोग पैटर्न है? क्या मुझे यकीन है कि आंतरिक संसाधन __del__
में ठीक से मुक्त हो जाएंगे?
This discussion एक समान प्रश्न उठाया लेकिन कोई संतोषजनक उत्तर नहीं मिला। मैं एक स्पष्ट close
विधि नहीं चाहता हूं, और with
का उपयोग करना एक विकल्प नहीं है, क्योंकि मेरी ऑब्जेक्ट को ओपन-प्ले-क्लोज़ के रूप में उपयोग नहीं किया जाता है, लेकिन इसे किसी अन्य, बड़े ऑब्जेक्ट के सदस्य के रूप में रखा जाता है, जीयूआई में चलते समय इसका इस्तेमाल करता है।
सी ++ पूरी तरह से विनाशकारी काम कर रहा है जहां कोई सुरक्षित रूप से संसाधनों को मुक्त कर सकता है, इसलिए मुझे लगता है कि पाइथन के पास कुछ भी सहमत है। किसी कारण से ऐसा लगता है कि यह मामला नहीं है, और समुदाय में कई लोग __del__
के खिलाफ शपथ लेते हैं। फिर विकल्प क्या है?
इस तरह के कनेक्शन का उपयोग करने वाले इंजेक्शन के लिए 'लीकी अबास्ट्रक्शन' तरीके में इस प्रकार का अवांछित नहीं है? मैं सिर्फ सी ++ में विनाशक का उपयोग क्यों नहीं कर सकता ?? –
@ एलीबेन: यह कर सकता है। हालांकि विनाशक कचरा कलेक्टरों और परिपत्र संदर्भों के साथ अच्छी तरह से नहीं जाते हैं (आपको विनाशक कहने से पहले परिपत्र संदर्भ को स्वयं हटा देना चाहिए) और आपके आवेदन में कनेक्शन एक उदाहरण (सिंगलटन) जैसा लगता है जो एक मॉड्यूल ग्लोबल अच्छी तरह से प्रदान करता है। यदि ऐसा नहीं है (आपको एकाधिक कनेक्शन की आवश्यकता है) तो आप एक विनाशक के लिए जा सकते हैं। बस परिपत्र संदर्भों को चारों ओर न रखें या आपको खुद को तोड़ना होगा। – nosklo
फिर सी ++ के विनाशक, ठीक नहीं। सही आरएआईआई के साथ कोडिंग, संसाधन के सूचक को एक स्मार्ट सूचक (शायद संदर्भित गिनती) के रूप में रखा जाएगा जो गिनती को स्वचालित रूप से 0 तक पहुंचने पर खुद को हटा दिया जाता है। हालांकि, इसके लिए अतिरिक्त मशीनरी (स्मार्ट पॉइंटर) के साथ-साथ –