Thông báo: Download 4 khóa học Python từ cơ bản đến nâng cao tại đây.
Phương thức del trong Python
Trong bài viết này, bạn sẽ tìm hiểu cách thức hoạt động của phương thức đặc biệt __del__
trong Python, cũng như vai trò của nó trong quá trình thu gom rác và quản lý bộ nhớ tự động. Phương thức này đóng vai trò quan trọng trong việc dọn dẹp các đối tượng không còn được sử dụng, giúp quản lý tài nguyên một cách hiệu quả hơn trong các ứng dụng Python.
Giới thiệu về phương thức del trong Python
Trong Python, trình thu gom rác (garbage collector) quản lý bộ nhớ tự động. Trình thu gom rác sẽ tiêu hủy các đối tượng không còn được tham chiếu.
Nếu một đối tượng triển khai phương thức __del__
, Python sẽ gọi phương thức này ngay trước khi trình thu gom rác tiêu hủy đối tượng.
Tuy nhiên, trình thu gom rác quyết định thời điểm tiêu hủy đối tượng, vì vậy, nó cũng quyết định khi nào phương thức __del__
sẽ được gọi.
Bài viết này được đăng tại [free tuts .net]
Phương thức __del__
đôi khi được gọi là phương thức "hoàn tất lớp" (class finalizer). Tuy nhiên, cần lưu ý rằng __del__
không phải là "hàm hủy" (destructor), vì chính trình thu gom rác mới là thứ tiêu hủy đối tượng, không phải __del__
.
Những hạn chế của phương thức del trong Python
Python sẽ gọi phương thức __del__
khi tất cả các tham chiếu đến đối tượng đã biến mất. Và trong hầu hết các trường hợp, bạn không thể kiểm soát được quá trình này.
Do đó, không nên sử dụng phương thức __del__
để giải phóng tài nguyên. Thay vào đó, nên sử dụng "quản lý ngữ cảnh" (context manager) để đảm bảo rằng các tài nguyên được dọn dẹp đúng cách.
Nếu phương thức __del__
có chứa tham chiếu đến các đối tượng khác, trình thu gom rác cũng sẽ tiêu hủy các đối tượng đó khi __del__
được gọi.
Nếu __del__
tham chiếu đến các đối tượng toàn cục (global objects), điều này có thể gây ra các hành vi không mong đợi.
Ngoài ra, nếu xảy ra ngoại lệ trong phương thức __del__
, Python sẽ không ném ra ngoại lệ đó mà chỉ im lặng. Tuy nhiên, Python sẽ gửi thông báo ngoại lệ đến stderr
, nên chương trình chính có thể nhận biết được các lỗi trong quá trình hoàn tất đối tượng.
Trên thực tế, bạn sẽ hiếm khi sử dụng phương thức __del__
.
Ví dụ về phương thức del trong Python
Ví dụ dưới đây định nghĩa một lớp Person
với phương thức đặc biệt __del__
, tạo một đối tượng mới và sau đó đặt nó về giá trị None
:
class Person: def __init__(self, name, age): self.name = name self.age = age def __del__(self): print('__del__ was called') if __name__ == '__main__': person = Person('John Doe', 23) person = None
Kết quả:
__del__ was called
Khi chúng ta đặt đối tượng person
về None
, trình thu gom rác sẽ tiêu hủy đối tượng này vì không còn tham chiếu nào đến nó. Do đó, phương thức __del__
đã được gọi.
Nếu bạn sử dụng từ khóa del
để xóa đối tượng person
, phương thức __del__
cũng sẽ được gọi:
person = Person('John Doe', 23) del person
Kết quả:
__del__ was called
Tuy nhiên, lệnh del
không gây ra việc gọi phương thức __del__
nếu đối tượng vẫn còn tham chiếu nào đó.