2010-08-24 9 views
6

मान लीजिए कि रनटाइम पर इसमें रहने वाली कुछ वस्तुओं के साथ एक प्रोग्राम है।__del__ प्रोग्राम अंत

क्या प्रोग्राम समाप्त होने पर प्रत्येक ऑब्जेक्ट की __del__ विधि कहा जाता है?

हाँ मैं उदाहरण के लिए कुछ इस तरह कर सकता है, तो:

class Client: 
    __del__(self): 
    disconnect_from_server() 

उत्तर

7

कई potential difficulties__del__ का उपयोग कर के साथ जुड़े रहे हैं। आमतौर पर, यह आवश्यक नहीं है, या इसे स्वयं परिभाषित करने का सबसे अच्छा विचार है।

इसके बजाय, अगर आप एक उद्देश्य यह है कि बाहर निकलने या एक अपवाद पर ही बाद को साफ करना चाहते हैं, का उपयोग एक context manager:

class Client: 
    def __exit__(self,ext_type,exc_value,traceback): 
     self.disconnect_from_server() 

with Client() as c: 
    ... 

मूल जवाब:

कार्ल टिप्पणी प्रति

import contextlib class Client: ... @contextlib.contextmanager def make_client(): c=Client() yield c c.disconnect_from_server() with make_client() as c: ... 
+1

इसके अलावा, आप इसे पूरा करने के तरीकों को परिभाषित कर सकते हैं: http://docs.python.org/reference/datamodel.html#with-statement-context-managers – carl

+0

@carl: धन्यवाद, मैं इसके बारे में भूल गया, और यह आसान होगा ... – unutbu

2

with-statement का उपयोग करने पर विचार करें साफ सफाई करने के लिए। वृत्तीय संदर्भ __del__ के साथ नहीं कहा जाता है:

class Foo: 
    def __del__(self): 
    self.p = None 
    print "deleting foo" 

a = Foo() 
b = Foo() 
a.p = b 
b.p = a 

प्रिंट कुछ भी नहीं।

5

मैं दूसरे संदर्भ प्रबंधकों का उपयोग के सामान्य विचार और इसके बजाय (ज्यादा एक ही कारणों के लिए __del__ पर भरोसा करने की with बयान एक जावा में finalizer तरीकों करने की कोशिश/अंत में पसंद करते हैं, के साथ साथ एक: अजगर में, __del__ तरीकों की उपस्थिति चक्रीय कचरा uncollectable कर सकते हैं)।

हालांकि, @ द्वारा दिए गए लक्ष्य "एक वस्तु है कि बाहर निकलने या एक अपवाद पर ही बाद को साफ" है कि, कार्यान्वयन ~ unutbu नहीं सही है:

@contextlib.contextmanager 
def make_client(): 
    c=Client() 
    yield c 
    c.disconnect_from_server() 

with make_client() as c: 
    ... 

एक अपवाद हैं ... भाग में उठाया गया है, disconnect_from_server_ नहीं कहा जाता है (चूंकि अपवाद make_client के माध्यम से प्रचारित होता है, वहां बेकार नहीं होता है, और इसलिए इसे yield पर प्रतीक्षा करते समय इसे समाप्त कर दिया जाता है)।

@contextlib.contextmanager 
def make_client(): 
    c=Client() 
    try: yield c 
    finally: c.disconnect_from_server() 

अनिवार्य रूप से, with बयान आप लगभग अच्छे पुराने ट्राई/अंत में बयान के बारे में भूल ... को छोड़कर जब आप contextlib साथ संदर्भ प्रबंधकों लिख रहे हैं कर सकते हैं:

ठीक सरल है , और फिर यह याद रखना वाकई महत्वपूर्ण है! -)

1

हां, पाइथन दुभाषिया शट डाउन पर टिडीज करता है, जिसमें प्रत्येक ऑब्जेक्ट की __del__ विधि को कॉल करना शामिल है (ऑब्जेक्ट्स को छोड़कर संदर्भ चक्र)।

हालांकि, जैसा कि अन्य ने इंगित किया है, __del__ विधियां बहुत नाजुक हैं और सावधानी के साथ उपयोग की जानी चाहिए।

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