1. Bản chất của module Python
Module trong Python thực chất là các tập tin có đuôi .py chứa mã nguồn có thể tái sử dụng. Mỗi module đóng vai trò như một thư viện nhỏ cung cấp các hàm, lớp và biến số được định nghĩa sẵn, giúp tổ chức code một cách có cấu trúc và dễ bảo trì.
2. Sự tiến hóa của hệ thống module
Trong những ngày đầu, Python thường bị các lập trình viên ngôn ngữ khác xem thường vì tính "dựa dẫm" vào các thư viện bên ngoài. Tuy nhiên, khi độ phức tạp của dự án tăng cao, cộng đồng nhận ra giá trị của hệ thống module - giúp tái sử dụng code, tăng năng suất và duy trì mã nguồn sạch đẹp.
3. Các dạng module trong thực tế
Module Python có thể xuất hiện dưới nhiều hình thức khác nhau:
- Tập tin .py đơn lẻ (module cơ bản nhất)
- Thư mục chứa nhiều tập tin .py (tổ chức theo chức năng)
- Mở rộng C/C++ được biên dịch thành DLL/shared library
- Module tích hợp sẵn trong interpreter (viết bằng C)
4. Phân loại module
4.1. Module tự định nghĩa
Các module do chính bạn viết ra cho dự án cụ thể, thường chứa các hàm tiện ích riêng của ứng dụng.
4.2. Module tích hợp sẵn
Python cung cấp sẵn hơn 200 module chuẩn như os, sys, datetime, json.
4.3. Module bên thứ ba
Các thư viện được cộng đồng phát triển như NumPy, Pandas, Requests, có thể cài đặt qua pip từ PyPI.
5. Cơ chế nhập module
5.1. Cú pháp import truyền thống
# Cách thông thường
import utilities
import utilities, config # Không khuyến khích
Giả sử có module utilities.py với nội dung:
user_name = 'admin'
def show_message():
print('Thông điệp từ utilities')
def process_data():
show_message()
def update_config():
global user_name
user_name = 'guest'
Khi thực thi import utilities, Python sẽ:
- Tạo namespace cho file chính
- Thực thi code trong utilities.py, đưa các tên vào namespace của module
- Tạo tên
utilitiestrong namespace chính - Truy cập qua dấu chấm:
utilities.user_name
5.2. Cú pháp from...import
from utilities import show_message
Quy trình:
- Tạo namespace cho file chính
- Thực thi code module
- Tạo tên trực tiếp trong namespace chính, liên kết với đối tượng module
- Sử dụng trực tiếp không cần dấu chấm
6. Điểm cần lưu ý khi nhập module
6.1. So sánh ưu nhược điểm
Import truyền thống:
- Ưu: Tránh xung đột tên, rõ ràng về nguồn gốc
- Nhược: Cú pháp dài hơn
From...import:
- Ưu: Ngắn gọn, trực tiếp
- Nhược: Dễ gây đè tên (shadowing)
6.2. Nhập module nhiều lần
Python chỉ thực thi module một lần duy nhất. Các lần import sau chỉ lấy tham chiếu từ cache sys.modules.
6.3. Đặt tên thay thế (Alias)
import configuration_manager as cfg_mgr
from utilities import show_message as display_msg
6.4. Nhập nhiều module
Cách 1: Từng dòng riêng biệt
import os
import sys
import time
Cách 2: Cùng một dòng
import os, sys, time # Ít được dùng
Cách 3: Nhập tất cả (wildcard)
from helpers import *
print(counter)
calculate_total()
Kiểm soát wildcard với __all__:
# helpers.py
counter = 0
def calculate_total():
pass
__all__ = ['counter'] # Chỉ nhập counter
7. Vấn đề nhập vòng tròn
7.1. Hiện tượng
Khi hai module cùng nhập lẫn nhau, gây lỗi ImportError do tham chiếu chưa được khởi tạo.
7.2. Giải pháp
Đặt câu lệnh import ở cuối file, sau khi đã định nghĩa các đối tượng cần thiết.
# module1.py
print('Đang nhập module1')
x = 'module1'
from module2 import y
# module2.py
print('Đang nhập module2')
y = 'module2'
from module1 import x
8. Phân biệt file thực thi và module
Sử dụng __name__:
if __name__ == '__main__':
# Code chỉ chạy khi file là main
test_function()
else:
# Code chạy khi được import
initialize_module()
9. Thứ tự tìm kiếm module
- Bộ nhớ cache (sys.modules)
- Module tích hợp sẵn
- sys.path (thư mục hiện tại, PYTHONPATH, site-packages)
Thêm đường dẫn tùy chỉnh:
import sys
sys.path.append('/path/to/custom/modules')
import my_module
10. Nhập tuyệt đối và nhập tương đối
10.1. Nhập tuyệt đối
from project.utils.helpers import formatter
from project.utils import validators
10.2. Nhập tương đối
from . import sibling_module
from ..parent import config
Lưu ý: Nhập tương đối chỉ dùng trong module, không dùng trong file thực thi chính.
11. Package trong Python
Package là thư mục chứa nhiều module, có file __init__.py (bắt buộc trong Python 2, tùy chọn trong Python 3 nhưng nên có để đảm bảo tương thích).
11.1. Cách sử dụng
Nhập module cụ thể:
from mypackage import module1, module2
Nhập cả package:
import mypackage
# Thực chất nhập __init__.py