การล้างข้อมูลเกิดขึ้นกับ globals โดยการตั้งค่าให้เป็น None ชาวบ้านทำลายตัวเองเมื่อสิ้นสุดเซสชั่น ฟังก์ชัน __del__ เรียกโดย Python ตั้งค่า globals เป็น None
พิจารณารหัสต่อไปนี้ซึ่งมีการล้างวัตถุทั้งหมดในคลาสที่กำหนด -
ตัวอย่าง
class Counter:
Count = 0 # This is the count of objects of this class
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 หากไม่มีเดลสุดท้าย คุณจะได้รับข้อยกเว้น
จากเอกสาร Python เกี่ยวกับ __del__ −
คำเตือน:เนื่องจากสถานการณ์ที่ล่อแหลมภายใต้การเรียกใช้เมธอด __del__() ข้อยกเว้นที่เกิดขึ้นระหว่างการดำเนินการจะถูกละเว้น และจะมีการพิมพ์คำเตือนไปที่ sys.stderr แทน นอกจากนี้ เมื่อเรียกใช้ __del__() เพื่อตอบสนองต่อโมดูลที่ถูกลบ (เช่น เมื่อดำเนินการโปรแกรมเสร็จสิ้น) globals อื่นๆ ที่อ้างอิงโดยเมธอด __del__() อาจถูกลบไปแล้ว ด้วยเหตุผลนี้ เมธอด __del__() ควรทำขั้นต่ำสุดที่จำเป็นเพื่อรักษาค่าคงที่ภายนอก
หากไม่มีการโทรไปที่ del อย่างชัดเจน __del__ จะถูกเรียกเมื่อสิ้นสุดโปรแกรมเท่านั้น ตัวนับและ/หรือ Count อาจได้รับ GC-ed แล้วเมื่อถึงเวลาเรียก __del__ (ลำดับในการรวบรวมออบเจ็กต์ไม่ได้กำหนดไว้) ข้อยกเว้นหมายความว่ามีการรวบรวมตัวนับแล้ว __del__ ทำอะไรแฟนซีเป็นพิเศษไม่ได้
มีวิธีแก้ปัญหาที่เป็นไปได้สองวิธีที่นี่
-
ใช้เมธอด finalizer ที่ชัดเจน เช่น close() สำหรับออบเจกต์ไฟล์
-
ใช้การอ้างอิงที่ไม่รัดกุม