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:
- Full series tự học Python từ cơ bản tới nâng cao tại đây nha.
- Ebook về python tại đây.
- Các series tự học lập trình khác
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!