การล้างข้อมูลเกิดขึ้นกับ 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() สำหรับออบเจกต์ไฟล์
-
ใช้การอ้างอิงที่ไม่รัดกุม