__del__
เป็นfinalizer เรียกว่าเมื่อวัตถุถูกเก็บรวบรวมขยะซึ่งเกิดขึ้นในบางจุดหลังจากการอ้างอิงถึงวัตถุทั้งหมดถูกลบไปแล้ว
ในกรณีง่ายๆนี่อาจเกิดขึ้นทันทีหลังจากที่คุณพูดdel x
หรือถ้าx
เป็นตัวแปรท้องถิ่นหลังจากฟังก์ชันสิ้นสุดลง โดยเฉพาะอย่างยิ่งเว้นแต่จะมีการอ้างอิงแบบวงกลม CPython (การใช้งาน Python มาตรฐาน) จะรวบรวมขยะทันที
อย่างไรก็ตามนี่คือรายละเอียดการใช้งานของ CPython คุณสมบัติที่จำเป็นเพียงอย่างเดียวของการรวบรวมขยะ Python คือมันเกิดขึ้นหลังจากที่มีการลบการอ้างอิงทั้งหมดดังนั้นสิ่งนี้อาจไม่จำเป็นเกิดขึ้นทันทีและอาจไม่เกิดขึ้นเลย
ยิ่งไปกว่านั้นตัวแปรสามารถมีชีวิตอยู่ได้เป็นเวลานานด้วยเหตุผลหลายประการเช่นข้อยกเว้นการเผยแผ่หรือการวิปัสสนาโมดูลสามารถทำให้จำนวนการอ้างอิงตัวแปรมากกว่า 0 ได้นอกจากนี้ตัวแปรยังสามารถเป็นส่วนหนึ่งของวงจรการอ้างอิงได้ - CPython ที่มีการรวบรวมขยะเปิดอยู่ในช่วงพักส่วนใหญ่ แต่ไม่ใช่ทั้งหมดวัฏจักรดังกล่าวและแม้กระทั่งเป็นระยะ ๆ
เนื่องจากคุณไม่มีการรับประกันว่าจะถูกเรียกใช้งานจึงไม่ควรใส่รหัสที่คุณต้องใช้ในการทำงาน__del__()
แต่รหัสนี้เป็นของfinally
ส่วนคำสั่งของtry
บล็อกหรือตัวจัดการบริบทในwith
คำสั่ง อย่างไรก็ตามมีกรณีการใช้งานที่ถูกต้องสำหรับ__del__
: เช่นหากอ็อบเจ็กต์X
อ้างอิงY
และยังเก็บสำเนาY
การอ้างอิงไว้ใน global cache
( cache['X -> Y'] = Y
) ดังนั้นX.__del__
การลบรายการแคชจะเป็นการดี
ถ้าคุณรู้ว่า destructor ให้ (ในการละเมิดแนวทางข้างต้น) ล้างจำเป็นคุณอาจต้องการที่จะเรียกมันว่าโดยตรงx.__del__()
เนื่องจากมีอะไรพิเศษเกี่ยวกับเรื่องนี้เป็นวิธีการที่: เห็นได้ชัดว่าคุณควรทำเช่นนั้นก็ต่อเมื่อคุณรู้ว่าไม่คิดที่จะถูกเรียกสองครั้ง หรือเป็นทางเลือกสุดท้ายคุณสามารถกำหนดวิธีการนี้ใหม่ได้โดยใช้
type(x).__del__ = my_safe_cleanup_method