Các hàm destructor (hàm hủy) sẽ được gọi khi một đối tượng bị hủy đi. Trong Python, các hàm destructors không quá cần thiết như trong C++, bởi vì Python đã có sẵn một garbage collector – trình thu gom bộ nhớ, giúp xử lý tự động việc quản lý bộ nhớ.

Phương thức __del__() còn được biết đến là phương thức destructor trong Python. Nó sẽ được gọi khi tất cả các tham chiếu đến đối tượng bị xóa đi, ví dụ như khi một đối tượng được garbage collector thu thập nhằm giải phóng bộ nhớ.

Cú pháp của hàm destructor trong Python:

def __del__(self):
  # body of destructor

Lưu ý: Tham chiếu đến đối tượng cũng sẽ bị xóa đi khi đối tượng này không còn được tham chiếu tới nữa, hoặc khi chương trình kết thúc.

Ví dụ 1: Dưới đây là một ví dụ đơn giản về hàm destructor. Bằng cách sử dụng từ khóa del, chúng ta sẽ xóa đi tất cả các tham chiếu của đối tượng ‘obj’, do đó hàm destructor sẽ tự động được gọi

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
# -----------------------------------------------------------


# Python program to illustrate destructor 
class Employee: 
  
    # Initializing 
    def __init__(self): 
        print('Employee created.') 
  
    # Deleting (Calling destructor) 
    def __del__(self): 
        print('Destructor called, Employee deleted.') 
  
obj = Employee() 
del obj 

Kết quả in ra là:

Employee created.
Destructor called, Employee deleted.

Lưu ý: Các hàm destructors sẽ được gọi sau khi chương trình đã kết thúc, hoặc khi tất cả các tham chiếu đến đối tượng bị xóa đi. Ví dụ như khi reference count – bộ đếm tham chiếu trở về 0. Còn đối với trường hợp object bị went out of scope, tức là chương trình đã chạy qua cái đoạn code chứa đối tượng rồi, thì tham chiếu tới đối tượng vẫn sẽ tồn tại, chứ không bị xóa đi, nên hàm destructor sẽ không được gọi.

Ví dụ 2: Sau đây là một ví dụ giải thích lưu ý ở bên trên. Trong ví dụ này, hàm destructor sẽ được gọi sau khi chuỗi ‘Program End…’ được in ra.


# Python program to illustrate destructor 
  
class Employee: 
  
    # Initializing  
    def __init__(self): 
        print('Employee created') 
  
    # Calling destructor 
    def __del__(self): 
        print("Destructor called") 
  
def Create_obj(): 
    print('Making Object...') 
    obj = Employee() 
    print('function end...') 
    return obj 
  
print('Calling Create_obj() function...') 
obj = Create_obj() 
print('Program End...') 

Kết quả in ra là:

Calling Create_obj() function...
Making Object...
Employee created
function end...
Program End...
Destructor called

Ví dụ 3: Xét ví dụ về hàm destructor sau:

# -----------------------------------------------------------
#Cafedev.vn - Kênh thông tin IT hàng đầu Việt Nam
#@author cafedevn
#Contact: cafedevn@gmail.com
#Fanpage: https://www.facebook.com/cafedevn
#Instagram: https://instagram.com/cafedevn
#Twitter: https://twitter.com/CafedeVn
#Linkedin: https://www.linkedin.com/in/cafe-dev-407054199/
# -----------------------------------------------------------


# Python program to illustrate destructor 
  
class A: 
    def __init__(self, bb): 
        self.b = bb 
  
class B: 
    def __init__(self): 
        self.a = A(self) 
    def __del__(self): 
        print("die") 
  
def fun(): 
    b = B() 
  
fun() 

Kết quả in ra là:

die

Trong ví dụ 3 ở trên, khi hàm fun() được gọi, nó sẽ tạo ta một thể hiện của class B, cái mà sẽ được truyền sang cho class A, sau đó class A lại thiết lập một tham chiếu tới class B, điều này sẽ gây ra một circular reference – tham chiếu vòng.

Nói chung, garbage collector (trình thu gom rác) của Python sẽ được sử dụng để phát hiện ra các loại cham chiếu vòng này, sau đó loại bỏ chúng. Nhưng trong ví dụ này, việc sử dụng hàm destructor đã được tùy chỉnh sẽ đánh dấu cái tác vụ này là “không thể thu thập – uncollectable”.

Đơn giản là, nó không biết được thứ tự để xóa đi các đối tượng là gì, vì vậy nó sẽ mặc kệ, cứ để chúng ở đó. Do đó, nếu các thể hiện của bạn có liên quan đến các tham chiếu vòng, thì chúng vẫn sẽ tồn tại bên trong bộ nhớ, chừng nào ứng dụng còn chạy.

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Nếu bạn thấy hay và hữu ích, bạn có thể tham gia các kênh sau của cafedev để nhận được nhiều hơn nữa:

Chào thân ái và quyết thắng!

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!