2011-07-14 2 views
16

निम्नलिखित कोड पर विचार करें:आप डेल या का उपयोग कर पसंद करेंगे कोई नहीं करने के लिए फिर नियत (कचरा एकत्र करने)

if value and self.fps_display is None: 
    self.fps_display = clock.ClockDisplay() 
elif not value and self.fps_display is not None: 
    self.fps_display.unschedule() 
    # Do this 
    del self.fps_display 
    # or this 
    self.fps_display = None 
    # or leave both in ? 

कौन सा बेहतर अजगर सफाई है?

उत्तर

22

कचरा संग्रह के लिए कोई अंतर नहीं है - दोनों मामलों में self.fps_display द्वारा इंगित ऑब्जेक्ट का संदर्भ जारी किया जाएगा। आपको किस का उपयोग करना चाहिए इस पर निर्भर करता है कि क्या आप अभी भी नाम मौजूद होना चाहते हैं (यद्यपि अब एक अलग वस्तु, None पर इशारा करते हुए), या नहीं।

+2

मैं आमतौर पर 'None' को निर्दिष्ट करने के लिए जाना है, क्योंकि यह आसान (और खूबसूरत) है' जाना अगर self.fps_display से 'अगर hasattr (स्वयं," fps_display ")' None' है। अपवाद अगर कुछ अलग अर्थों के लिए 'कोई नहीं' की आवश्यकता है (लेकिन फिर मैं "मौजूद नहीं" इंगित करने के बजाय 'एलिप्सिस' का उपयोग करता हूं)। –

+2

तो वास्तव में डेल कचरा संग्रहण प्रक्रिया को सीधे कॉल नहीं करता है, यह केवल तब ही रिफाउंटर को कम करता है और संग्राहक को सफाई के लिए कचरा स्थान में परिवर्तनीय लटकता छोड़ देता है? – Red15

+3

@ लाल 15: सही। –

13

आपके पास एक विशेषता है, fps_display

आपको विशेषता को अजीब रूप से वैकल्पिक या कभी-कभी गायब नहीं करना चाहिए।

यदि यह प्रथम श्रेणी की विशेषता है - और उचित रूप से दिखाई देता है - इसे किसी भी संसाधन को जारी करने के लिए None पर सेट किया जाना चाहिए। विशेषता को हटाना डरावना है क्योंकि ऑब्जेक्ट में अब वैकल्पिक विशेषताएं हैं और आश्चर्यजनक अपवाद उठाते हैं।

self.fps_display = None 
संबंधित मुद्दे

 संबंधित मुद्दे