मैं उन withसंसाधनों को प्रबंधित करने के लिए पायथन के बयान का उपयोग करने की सलाह दूंगा जिन्हें साफ करने की आवश्यकता है। एक स्पष्ट close()कथन का उपयोग करने में समस्या यह है कि आपको ऐसे लोगों के बारे में चिंता करना होगा जो इसे कॉल करने के लिए भूल जाते हैं या finallyअपवाद होने पर संसाधन रिसाव को रोकने के लिए इसे ब्लॉक में रखना भूल जाते हैं ।
withकथन का उपयोग करने के लिए , निम्न विधियों के साथ एक वर्ग बनाएं:
def __enter__(self)
def __exit__(self, exc_type, exc_value, traceback)
ऊपर आपके उदाहरण में, आप उपयोग करेंगे
class Package:
def __init__(self):
self.files = []
def __enter__(self):
return self
# ...
def __exit__(self, exc_type, exc_value, traceback):
for file in self.files:
os.unlink(file)
फिर, जब कोई आपकी कक्षा का उपयोग करना चाहता था, तो वे निम्नलिखित कार्य करेंगे:
with Package() as package_obj:
# use package_obj
चर package_obj एक प्रकार का पैकेज होगा (यह __enter__विधि द्वारा दिया गया मान है )। इसकी __exit__विधि को स्वचालित रूप से कहा जाएगा, भले ही कोई अपवाद हो या न हो।
आप भी इस दृष्टिकोण को एक कदम आगे ले जा सकते हैं। ऊपर दिए गए उदाहरण में, कोई भी withक्लॉज का उपयोग किए बिना अपने कंस्ट्रक्टर का उपयोग करके पैकेज को तुरंत लिख सकता है । आप ऐसा नहीं चाहते हैं। आप इसे ठीक कर सकते हैं एक PackageResource वर्ग जो विधियों __enter__और __exit__विधियों को परिभाषित करता है । फिर, पैकेज वर्ग को __enter__विधि के अंदर सख्ती से परिभाषित किया जाएगा और वापस आ जाएगा। इस तरह, कॉलर कभी भी withबयान का उपयोग किए बिना पैकेज वर्ग को तुरंत नहीं दे सकता है :
class PackageResource:
def __enter__(self):
class Package:
...
self.package_obj = Package()
return self.package_obj
def __exit__(self, exc_type, exc_value, traceback):
self.package_obj.cleanup()
आप इसका उपयोग इस प्रकार करेंगे:
with PackageResource() as package_obj:
# use package_obj