यह सामान्य ज्ञान अजगर __del__
तरीके के रूप में इस विधि कहा जाता हो जाता है इसकी गारंटी नहीं है, महत्वपूर्ण बातों को साफ करने के लिए नहीं किया जाना चाहिए के रूप में। विकल्प कई संदर्भों में वर्णित एक संदर्भ प्रबंधक का उपयोग है।पायथन में __del__ के उपयोग से बचने के लिए संदर्भ प्रबंधक का उपयोग कैसे करें?
लेकिन मैं काफी है कि कैसे एक संदर्भ प्रबंधक का उपयोग करने के लिए एक वर्ग के पुनर्लेखन के लिए समझ में नहीं आता। विस्तृत करने के लिए, मेरे पास एक सरल (गैर-कामकाजी) उदाहरण है जिसमें एक रैपर वर्ग खुलता है और डिवाइस को बंद करता है, और किसी भी मामले में डिवाइस को बंद कर देगा, कक्षा का उदाहरण इसके दायरे से बाहर हो जाता है (अपवाद आदि)।
class MyWrapper(object):
def __init__(self, device):
self.device = device
def open(self):
self.device.open()
def close(self):
self.device.close()
def __del__(self):
self.close()
इस वर्ग एक और वर्ग myclass.py
द्वारा किया जाता है:
पहली फ़ाइल mydevice.py
खोलने के लिए और एक डिवाइस बंद करने के लिए एक मानक आवरण वर्ग है
import mydevice
class MyClass(object):
def __init__(self, device):
# calls open in mydevice
self.mydevice = mydevice.MyWrapper(device)
self.mydevice.open()
def processing(self, value):
if not value:
self.mydevice.close()
else:
something_else()
मेरा प्रश्न: जब मैं लागू __enter__
और __exit__
तरीकों के साथ mydevice.py
में संदर्भ प्रबंधक, कैसे इस वर्ग myclass.py
में संभाला जा सकता है? मुझे
def __init__(self, device):
with mydevice.MyWrapper(device):
???
जैसे कुछ करने की आवश्यकता है, लेकिन फिर इसे कैसे संभालें? शायद मैंने कुछ महत्वपूर्ण नजरअंदाज कर दिया? या क्या मैं केवल एक फ़ंक्शन के भीतर एक संदर्भ प्रबंधक का उपयोग कर सकता हूं, न कि क्लास स्कोप के अंदर एक चर के रूप में?
पहले जैसा ही टिप्पणी है: मुझे पहले से पता नहीं है कि डिवाइस के साथ क्या होता है, लेकिन इसे खोला जाएगा और कई अन्य तरीकों, कक्षाओं आदि में उपयोग किया जाएगा। क्या यह मामला मुझे अभी भी '__del__' का उपयोग करना चाहिए? – Alex
मुझे लगता है कि '__del __()' इस खुले अंत व्यवहार के लिए आपका एकमात्र खुला है। ध्यान रखें कि '__del __()' केवल तभी बुलाया जाता है जब कचरा कलेक्टर को आपकी कक्षा से संबंधित संदर्भ चक्र मिल जाए। आप समय-समय पर ['gc.garbage'] (http://docs.python.org/2/library/gc.html#gc.garbage) की जांच करके और संदर्भ चक्रों को तोड़कर अपने कोड में मैन्युअल रूप से इसका पता लगा सकते हैं और हल कर सकते हैं समस्या पैदा कर रहे हैं। – Cartroo