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

การทำลายวัตถุ (การรวบรวมขยะ) ใน Python


Python ลบวัตถุที่ไม่จำเป็น (ประเภทในตัวหรืออินสแตนซ์ของคลาส) โดยอัตโนมัติเพื่อเพิ่มพื้นที่หน่วยความจำ กระบวนการที่ Python เรียกคืนบล็อกของหน่วยความจำที่ไม่ได้ใช้อีกต่อไปเป็นระยะนั้นเรียกว่า Garbage Collection

ตัวรวบรวมขยะของ Python ทำงานระหว่างการทำงานของโปรแกรมและถูกทริกเกอร์เมื่อจำนวนการอ้างอิงของวัตถุถึงศูนย์ จำนวนการอ้างอิงของออบเจ็กต์เปลี่ยนไปตามจำนวนนามแฝงที่ชี้ไปที่การเปลี่ยนแปลง

จำนวนอ้างอิงของออบเจ็กต์เพิ่มขึ้นเมื่อมีการกำหนดชื่อใหม่หรือวางไว้ในคอนเทนเนอร์ (รายการ ทูเพิล หรือพจนานุกรม) จำนวนการอ้างอิงของออบเจ็กต์ลดลงเมื่อถูกลบด้วย del การอ้างอิงถูกกำหนดใหม่ หรือการอ้างอิงอยู่นอกขอบเขต เมื่อจำนวนการอ้างอิงของวัตถุถึงศูนย์ Python จะรวบรวมโดยอัตโนมัติ

a = 40 # Create object <40>
b = a # Increase ref. count of <40>
c = [b] # Increase ref. count of <40>
del a # Decrease ref. count of <40>
b = 100 # Decrease ref. count of <40>
c[0] = -1 # Decrease ref. count of <40>

โดยปกติคุณจะไม่สังเกตเห็นเมื่อตัวรวบรวมขยะทำลายอินสแตนซ์ที่ถูกละเลยและเรียกคืนพื้นที่ แต่คลาสสามารถใช้เมธอดพิเศษ __del__() ที่เรียกว่า destructor ซึ่งถูกเรียกใช้เมื่ออินสแตนซ์กำลังจะถูกทำลาย วิธีนี้อาจใช้เพื่อล้างทรัพยากรที่ไม่ใช่หน่วยความจำที่ใช้โดยอินสแตนซ์

ตัวอย่าง

ตัวทำลาย __del__() นี้พิมพ์ชื่อคลาสของอินสแตนซ์ที่กำลังจะถูกทำลาย -

#!/usr/bin/python
class Point:
   def __init__( self, x=0, y=0):
      self.x = x
      self.y = y
   def __del__(self):
      class_name = self.__class__.__name__
      print class_name, "destroyed"
pt1 = Point()
pt2 = pt1
pt3 = pt1
print id(pt1), id(pt2), id(pt3) # prints the ids of the obejcts
del pt1
del pt2
del pt3

ผลลัพธ์

เมื่อโค้ดด้านบนถูกรัน มันจะให้ผลลัพธ์ดังต่อไปนี้ −

3083401324 3083401324 3083401324
Point destroyed

หมายเหตุ - ตามหลักการแล้ว คุณควรกำหนดคลาสของคุณในไฟล์แยกต่างหาก จากนั้นคุณควรนำเข้าคลาสเหล่านี้ในไฟล์โปรแกรมหลักของคุณโดยใช้คำสั่งนำเข้า