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:

Cách thêm Progress Bar trong Python với chỉ một dòng Code

Cách thêm Progress Bar trong Python với chỉ một dòng Code

Toán tử Walrus Operator- Tính năng mới trong Python 3.8

Toán tử Walrus Operator- Tính năng mới trong Python 3.8

Cách nạp dữ liệu Machine Learning từ File trong Python

Cách nạp dữ liệu Machine Learning từ File trong Python

Hướng dẫn sử dụng Google Sheets API với Python

Hướng dẫn sử dụng Google Sheets API với Python

Xây dựng  web Python tự động hóa Twitter | Flask, Heroku, Twitter API & Google Sheets API

Xây dựng web Python tự động hóa Twitter | Flask, Heroku, Twitter API & Google Sheets API

Xây dựng Web Machine Learning đẹp mắt với Streamlit và Scikit-learn trong Python

Xây dựng Web Machine Learning đẹp mắt với Streamlit và Scikit-learn trong Python

Hướng dẫn tạo Chatbot đơn giản bằng PyTorch

Hướng dẫn tạo Chatbot đơn giản bằng PyTorch

11 mẹo và thủ thuật để viết Code Python hiệu quả hơn

11 mẹo và thủ thuật để viết Code Python hiệu quả hơn

Hướng dẫn làm ứng dụng TODO với Flask dành cho người mới bắt đầu trong Python

Hướng dẫn làm ứng dụng TODO với Flask dành cho người mới bắt đầu trong Python

Hướng dẫn viết Snake Game bằng Python

Hướng dẫn viết Snake Game bằng Python

Cách sử dụng chế độ interactive trong Python

Cách sử dụng chế độ interactive trong Python

Cách sử dụng Python Debugger với hàm breakpoint()

Cách sử dụng Python Debugger với hàm breakpoint()

Xây dựng ứng dụng Web Style Transfer với PyTorch và Streamlit

Xây dựng ứng dụng Web Style Transfer với PyTorch và Streamlit

Cách cài đặt Jupyter Notebook trong môi trường Conda và thêm Kernel

Cách cài đặt Jupyter Notebook trong môi trường Conda và thêm Kernel

Hướng dẫn xây dựng ứng dụng dự đoán giá cổ phiếu bằng Python

Hướng dẫn xây dựng ứng dụng dự đoán giá cổ phiếu bằng Python

Hướng dẫn tạo ứng dụng AI hội thoại với NVIDIA Jarvis trong Python

Hướng dẫn tạo ứng dụng AI hội thoại với NVIDIA Jarvis trong Python

Hỗ trợ Async trong Django 3.1

Hỗ trợ Async trong Django 3.1

8 mẹo tái cấu trúc Python giúp mã sạch hơn và Pythonic

8 mẹo tái cấu trúc Python giúp mã sạch hơn và Pythonic

Ý nghĩa của if __name__ ==

Ý nghĩa của if __name__ == "__main__" trong Python

Cách xóa phần tử trong danh sách Python

Cách xóa phần tử trong danh sách Python

Top