INTRODUCTION
FLOW CONTROL
FUNCTIONS
DATATYPES
OBJECT & CLASS
Bài tập Python: Lập trình hướng đối tượng (OOP) trong Python Lập trình hướng đối tượng trong Python Class Variables trong Python Tìm hiểu về Methods trong Python Cách sử dụng phương thức __init__() trong Python Các biến Instance trong Python Tìm hiểu về Class Attributes trong Python Hàm Static Methods trong Python Phương thức __str__ trong Python Phương thức __repr__ trong Python Phương thức eq trong Python Tìm hiểu phương thức __hash__ trong Python Phương thức __bool__ trong Python Phương thức del trong Python Tìm hiểu về lớp Property trong Python Tìm hiểu về nạp chồng toán tử trong Python Trình Decorator Property trong Python Thuộc tính chỉ đọc trong Python Thuộc tính Delete trong Python Sử dụng super() trong Python Sử dụng __slots__ trong Python Cách sử dụng Protocol trong Python Sử dụng Enum aliases và @enum.unique trong Python Tùy chỉnh và mở rộng lớp Enum trong Python Cách sử dụng hàm Auto() của Python Single Responsibility Principle trong Python Nguyên tắc Đóng-Mở trong Python Nguyên tắc thay thế Liskov - LSP trong Python Interface Segregation Principle - ISP trong Python. Nguyên tắc đảo ngược sự phụ thuộc trong Python Đa kế thừa trong Python Tìm hiểu về các lớp mixin trong Python Mô tả Descriptors trong Python Phân biệt Data Descriptor và Non-data Descriptor trong Python Phương thức __new__ trong Python Tìm hiểu về Class Type trong Python Lớp Metaclass trong Python Ví dụ sử dụng metaclass trong Python Tìm hiểu về decorator dataclass trong Python Tìm hiểu về các ngoại lệ trong Python Ngoại lệ Raise trong Python Sử dụng câu lệnh raise from trong Python Ngoại lệ tùy chỉnh trong Python Module trong Python Package trong Python Class trong Python Hàm khởi tạo trong Python Kế thừa trong Python Đa kế thừa trong Python Setter và Getter trong Python Override trong Python Interface trong Python Bài tập Python: Module và Class
ADVANCED TOPICS
BỔ SUNG
PYTHON CĂN BẢN
CÁC CHỦ ĐỀ
BÀI MỚI NHẤT
MỚI CẬP NHẬT

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.

test php

banquyen png
Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

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 đó.

Kết bài

Tóm lại, phương thức __del__ trong Python được gọi ngay trước khi một đối tượng bị thu gom rác, nhưng việc phụ thuộc vào nó để giải phóng tài nguyên có thể không đáng tin cậy do các ngoại lệ sẽ bị im lặng. Thay vào đó, nên sử dụng kỹ thuật "quản lý ngữ cảnh" để đảm bảo việc dọn dẹp tài nguyên được thực hiện an toàn và đúng cách. Điều này giúp bạn tránh các rủi ro tiềm ẩn và đảm bảo hiệu quả khi làm việc với tài nguyên trong ứng dụng Python của mình.

Cùng chuyên mục:

Sử dụng câu lệnh raise from trong Python

Sử dụng câu lệnh raise from trong Python

Ngoại lệ tùy chỉnh trong Python

Ngoại lệ tùy chỉnh trong Python

Ngoại lệ Raise trong Python

Ngoại lệ Raise trong Python

Tìm hiểu về các ngoại lệ trong Python

Tìm hiểu về các ngoại lệ trong Python

Tìm hiểu về decorator dataclass trong Python

Tìm hiểu về decorator dataclass trong Python

Ví dụ sử dụng metaclass trong Python

Ví dụ sử dụng metaclass trong Python

Lớp Metaclass trong Python

Lớp Metaclass trong Python

Tìm hiểu về Class Type trong Python

Tìm hiểu về Class Type trong Python

Phương thức __new__ trong Python

Phương thức __new__ trong Python

Phân biệt Data Descriptor và Non-data Descriptor trong Python

Phân biệt Data Descriptor và Non-data Descriptor trong Python

Mô tả Descriptors trong Python

Mô tả Descriptors trong Python

Tìm hiểu về các lớp mixin trong Python

Tìm hiểu về các lớp mixin trong Python

Đa kế thừa trong Python

Đa kế thừa trong Python

Nguyên tắc đảo ngược sự phụ thuộc trong Python

Nguyên tắc đảo ngược sự phụ thuộc trong Python

Interface Segregation Principle - ISP trong Python.

Interface Segregation Principle - ISP trong Python.

Nguyên tắc thay thế Liskov - LSP trong Python

Nguyên tắc thay thế Liskov - LSP trong Python

Nguyên tắc Đóng-Mở trong Python

Nguyên tắc Đóng-Mở trong Python

Single Responsibility Principle trong Python

Single Responsibility Principle trong Python

Cách sử dụng hàm Auto() của Python

Cách sử dụng hàm Auto() của Python

Tùy chỉnh và mở rộng lớp Enum trong Python

Tùy chỉnh và mở rộng lớp Enum trong Python

Top