ক্লিনআপ গ্লোবালগুলোর সাথে হয় সেগুলোকে None সেট করে। লোকালগুলো সেশন শেষে সেলফ-ডেস্ট্রাক্ট হয়। __del__ ফাংশন পাইথন দ্বারা কল হয়ে গ্লোবালগুলোকে None সেট করে।
নিচের কোডে দেওয়া ক্লাসের সকল অবজেক্টের ক্লিনআপ দেখানো হলো:
উদাহরণ
class Counter:
Count = 0 # এই ক্লাসের অবজেক্টের কাউন্ট
def __init__(self, name):
self.name = name
print name, 'created'
Counter.Count += 1
def __del__(self):
print self.name, 'deleted'
Counter.Count -= 1
if Counter.Count == 0:
print 'Last Counter object deleted'
else:
print Counter.Count, 'Counter objects remaining'
x = Counter("First")
del x শেষের del ছাড়া এক্সেপশন হয়।
পাইথন ডকস থেকে __del__ সম্পর্কে সতর্কতা:
সতর্কতা: __del__() মেথড যেসব প্রিক্যারিয়াস পরিস্থিতিতে আহ্বান করা হয়, সেগুলোর এক্সিকিউশন време এক্সেপশন হলে সেগুলো ইগনোর হয়, এবং স্ট্র 쓰는 대신 ওয়ার্নিং প্রিন্ট হয়। এছাড়া, যখন __del__() মডিউল ডিলিট হওয়ার রেসপন্সে আহ্বান করা হয় (যেমন প্রোগ্রাম এক্সিকিউশন শেষে), __del__() মেথড দ্বারা রেফারেন্সড অন্যান্য গ্লোবাল ইতিমধ্যে ডিলিট হয়ে যেতে পারে। এই কারণেই, __del__() মেথডগুলো এক্সটার্নেল ইনভেরিয়েন্ট মেইনটেইন করার জন্য অপরিহার্য ন্যূনতম কাজই করা উচিত।
স্পষ্ট del কল ছাড়া, __del__ প্রোগ্রাম শেষে কল হয়, Counter এবং/অথবা Count ইতিমধ্যে GC-ড হয়ে যেতে পারে __del__ কল হওয়ার আগে (অবজেক্ট কালেকশনের অর্ডার ডিটারমিনিস্টিক নয়)। এক্সেপশন মানে Counter ইতিমধ্যে কালেক্ট হয়েছে। আপনি __del__ দিয়ে কিছু খাস ফ্যান্সি করতে পারবেন না।
এখানে দুটি সম্ভাব্য সমাধান আছে।
এক্সপ্লিসিট ফাইনালাইজার মেথড ব্যবহার করুন, যেমন ফাইল অবজেক্টের জন্য
close()।ইউজ করুন weak references।