निम्न उदाहरण कोडकिसी ऑब्जेक्ट के दूसरे प्रारंभिकरण पर, __init__ को __del__ से पहले क्यों कहा जाता है?
class A:
def __init__(self, i):
self.i = i
print("Initializing object {}".format(self.i))
def __del__(self):
print("Deleting object {}".format(self.i))
for i in [1, 2]:
a = A(i)
वस्तु बनाना भीतर पाश आश्वस्त करने के लिए है कि इससे पहले कि नया एक वस्तु बनाया जा होगा एक की नाशक कहा जाएगा इरादा था पर विचार करें। लेकिन जाहिरा तौर पर निम्न होता है:
आरंभ किया जा रहा वस्तु 1
आरंभ किया जा रहा वस्तु 2
हटाया जा रहा वस्तु 1
हटाया जा रहा वस्तु 2
क्यों वस्तु 1 का नाशक है केवल नई वस्तु शुरू करने के बाद बुलाया गया है? क्या यह एक इरादा व्यवहार है? मुझे पता है कि लूप के लिए अजगर में कोई गुंजाइश नहीं है। उदाहरण के लिए, सी ++ में, 1 के विनाशक को निश्चित रूप से ऑब्जेक्ट 2 के लिए कन्स्ट्रक्टर के समक्ष कहा जाएगा (कम से कम यदि ऑब्जेक्ट लूप के भीतर घोषित किया गया हो)।
मेरे कार्यक्रम में मैं यह आश्वस्त करना चाहता हूं कि नया ऑब्जेक्ट बनाया गया है इससे पहले कि नया ऑब्जेक्ट बनाया गया हो। क्या लूप के अंत में a
को हटाने से अलग कोई और संभावना है?
अग्रिम धन्यवाद।
दिलचस्प बात तब होती है जब आप लूप को '[1,2,3]' से अधिक बदलते हैं। – kennytm
यह एक अच्छा साक्षात्कार सवाल करेगा। – pajton
अंतिम अनुच्छेद पुन: आप ऐसा नहीं करना चाहते हैं। क्योंकि आप नहीं कर सकते (जीसी गैर-निर्धारिती है और refcounting एक कार्यान्वयन विस्तार है), और आपको वैसे भी जरूरत नहीं है। यदि आपके पास निपटान करने के लिए संसाधन हैं, तो संदर्भ प्रबंधक ('कथन के साथ) का उपयोग करें या' .close() 'जैसी विधि जोड़ें और सुनिश्चित करें कि इसे कॉल किया गया है। – delnan