Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Python

पायथन ऑब्जेक्ट को सही तरीके से कैसे साफ़ करें?


क्लीनअप ग्लोबल्स को None पर सेट करके होता है। लोकल्स सत्र के अंत में स्वयं नष्ट हो जाते हैं। पायथन द्वारा कॉल किया गया फ़ंक्शन __del__ ग्लोबल्स को None पर सेट करता है।

निम्न कोड पर विचार करें जहां दिए गए क्लास में सभी ऑब्जेक्ट्स का क्लीनअप होता है:

उदाहरण

class Counter:\n    Count = 0  # इस क्लास के ऑब्जेक्ट्स की गिनती\n    def __init__(self, name):\n        self.name = name\n        print(name, 'created')\n        Counter.Count += 1\n    def __del__(self):\n        print(self.name, 'deleted')\n        Counter.Count -= 1\n        if Counter.Count == 0:\n            print('Last Counter object deleted')\n        else:\n            print(Counter.Count, 'Counter objects remaining')\nx = Counter("First")\ndel x

अंतिम del के बिना, आपको एक अपवाद मिलता है।

__del__ के संबंध में पायथन डॉक्स से:

चेतावनी: उन अनिश्चित परिस्थितियों के कारण जिनके तहत __del__() मेथड्स को आमंत्रित किया जाता है, उनके निष्पादन के दौरान होने वाले अपवादों को नजरअंदाज कर दिया जाता है, और एक चेतावनी sys.stderr पर प्रिंट की जाती है। साथ ही, जब __del__() को मॉड्यूल हटाए जाने के जवाब में आमंत्रित किया जाता है (उदाहरण के लिए, जब प्रोग्राम का निष्पादन पूरा हो जाता है), तो __del__() मेथड द्वारा संदर्भित अन्य ग्लोबल्स पहले ही हटाए जा चुके हो सकते हैं। इस कारण से, __del__() मेथड्स को बाहरी इनवेरिएंट्स को बनाए रखने के लिए आवश्यक न्यूनतम कार्य करना चाहिए।

स्पष्ट del कॉल के बिना, __del__ केवल प्रोग्राम के अंत में कहा जाता है, Counter और/या Count पहले ही GC-ed हो चुके हो सकते हैं जब तक __del__ कहा जाता है (ऑब्जेक्ट्स के कलेक्ट होने का क्रम नियतात्मक नहीं है)। अपवाद का मतलब है कि Counter पहले ही कलेक्ट हो चुका है। आप __del__ के साथ कुछ विशेष रूप से फैंसी नहीं कर सकते।

यहां दो संभावित समाधान हैं।

  • एक स्पष्ट फाइनलाइज़र मेथड का उपयोग करें, जैसे फ़ाइल ऑब्जेक्ट्स के लिए close()।

  • कमजोर संदर्भों (weak references) का उपयोग करें।

  1. - नेस्टेड पायथन डिक्शनरी कैसे बनाएं?

    एक डिक्शनरी ऑब्जेक्ट म्यूटेबल होता है। इसलिए एक डिक्शनरी ऑब्जेक्ट को की के वैल्यू कंपोनेंट के रूप में उपयोग किया जा सकता है। तो हम एक नेस्टेड डिक्शनरी ऑब्जेक्ट बना सकते हैं जब दूसरा डिक्शनरी ऑब्जेक्ट की से जुड़ी वैल्यू के रूप में परिभाषित किया जाता है। >>> students = { ... student1: {n

  1. - पायथन में डिक्शनरी के अंदर डिक्शनरी कैसे परिभाषित करें?

    एक डिक्शनरी ऑब्जेक्ट म्यूटेबल होता है। इसलिए एक डिक्शनरी ऑब्जेक्ट को किसी कुंजी के मान घटक के रूप में उपयोग किया जा सकता है। तो हम एक नेस्टेड डिक्शनरी ऑब्जेक्ट बना सकते हैं जहां दूसरा डिक्शनरी ऑब्जेक्ट कुंजी से जुड़े मान के रूप में परिभाषित होता है।>>>> students={student1:{name:Raaj, age

  1. - पायथन फंक्शन से JSON ऑब्जेक्ट कैसे लौटाएं?

    दिए गए पायथन डिक्शनरी का उपयोग करके पायथन फंक्शन से JSON ऑब्जेक्ट को निम्नानुसार लौटाया जाता है। उदाहरण import json a = {name:Sarah, age: 24, isEmployed: True } # a python dictionary def retjson(): python2json = json.dumps(a) print python2json retjson() आउटपुट {age: 24, isEmployed: true, nam