Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

ฉันจะล้างวัตถุ Python อย่างถูกต้องได้อย่างไร


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

  • ใช้การอ้างอิงที่ไม่รัดกุม