Giới thiệu về Module trong Python
Module là một chủ đề thú vị! Trong Python, module đóng vai trò quan trọng trong việc tổ chức mã nguồn, giúp tái sử dụng và duy trì mã dễ dàng hơn. Trong bài viết này, chúng ta sẽ cùng nhau khám phá khái niệm module trong Python, cách sử dụng chúng cũng như những lưu ý quan trọng.
Mục lục
- Module là gì?
- Các loại Module trong Python
- Hệ thống tìm kiếm module (sys.path)
- Thực hành tốt nhất khi làm việc với Module
- Các cạm bẫy phổ biến khi sử dụng Module
- Kết luận
- Câu hỏi thường gặp
Module là gì?
Trong Python, module được coi là một lớp trung gian giữa các lớp (class) và gói (package). Module cho phép tổ chức mã nguồn thành các phần riêng biệt, dễ dàng quản lý và tái sử dụng. Ví dụ:
Ví dụ không tốt:
python
# MyClass.py
class MyClass:
def my_method(self):
print("Xin chào từ MyClass!")
Khi bạn cố gắng sử dụng lớp này trong một script khác, bạn sẽ làm như sau:
python
# class_usage.py
from MyClass import MyClass # lạ đúng không?
my_instance = MyClass()
my_instance.my_method()
Tại sao đây là một ví dụ không tốt?
- Đầu tiên, tên file nên được viết theo quy tắc
snake_case
theo PEP 8, nên nó nên làmy_class.py
. - Thứ hai, bạn đang nhập một lớp từ một file có cùng tên với lớp. Đây không phải là một thực hành tốt trong Python.
Điều này có thể gây nhầm lẫn, đặc biệt nếu bạn đến từ ObjectScript, nơi mà các lớp được định nghĩa trong các file có cùng tên với lớp.
Các loại Module trong Python
Module là file Python
Như chúng ta đã thấy, module có thể là một file Python nhưng không có phần mở rộng .py
. Nhưng chờ đã, điều này có nghĩa là một script Python cũng là một module đúng không? Đúng vậy!
Do đó, bạn nên cẩn thận khi nhập một script, vì mã trong script đó sẽ được thực thi. Xem thêm về giới thiệu Python.
Module là thư mục với file __init__.py
Wow, một thư mục có thể là một module? Đúng vậy!
Một thư mục có thể trở thành module nếu nó chứa một file __init__.py
. File này có thể rỗng hoặc chứa mã khởi tạo cho module.
Ví dụ:
src/python/article/
└── my_folder_module/
├── __init__.py
├── my_sub_module.py
└── another_sub_module.py
python
# my_folder_module/my_sub_module.py
class MySubModule:
def my_method(self):
print("Xin chào từ MySubModule!")
python
# my_folder_module/another_sub_module.py
class AnotherSubModule:
def another_method(self):
print("Xin chào từ AnotherSubModule!")
python
# my_folder_module/__init__.py
# File này có thể rỗng hoặc chứa mã khởi tạo cho module.
Trong trường hợp này, my_folder_module
là một module và bạn có thể nhập nó như sau:
python
from my_folder_module import my_sub_module, another_sub_module
Nếu bạn định nghĩa một file __init__.py
với nội dung sau:
python
# my_folder_module/__init__.py
from .my_sub_module import MySubModule
from .another_sub_module import AnotherSubModule
Bạn có thể nhập nó như sau:
python
from my_folder_module import MySubModule, AnotherSubModule
Bạn thấy sự tinh tế chưa? Bạn có thể nhập các lớp trực tiếp từ module mà không cần chỉ định sub-module, vì file __init__.py
được thực thi khi bạn nhập module, và nó có thể xác định những gì có sẵn trong không gian tên của module.
Hệ thống tìm kiếm module (sys.path)
Khi bạn nhập một module, Python tìm kiếm nó trong các thư mục được liệt kê trong sys.path
. Đây là danh sách các chuỗi xác định đường dẫn tìm kiếm cho các module.
Bạn có thể xem sys.path
hiện tại bằng cách chạy mã sau:
python
import sys
print(sys.path)
Theo mặc định, nó bao gồm thư mục hiện tại và các thư mục khác tùy thuộc vào cài đặt Python của bạn.
Bạn cũng có thể thêm các thư mục vào sys.path
trong thời gian chạy, điều này rất hữu ích khi bạn muốn nhập các module từ một vị trí cụ thể. Ví dụ:
python
import sys
sys.path.append('/path/to/your/module')
from your_module import YourClass
sys.path và các thư mục khác
Các thư mục khác trong sys.path
thường là:
- Thư mục chứa script đầu vào (hoặc thư mục hiện tại nếu không có script nào được chỉ định).
- Thư viện tiêu chuẩn chứa các module tích hợp đi kèm với Python.
- Thư mục site-packages nơi các gói bên thứ ba được cài đặt.
site-packages
Thư mục site-packages hoạt động như thế nào? Khi bạn cài đặt một gói bằng pip, nó sẽ được cài đặt trong thư mục site-packages
, và thư mục này được tự động bao gồm trong sys.path
. Điều này cho phép bạn nhập gói mà không cần chỉ định vị trí của nó.
🤨🔍 Nhưng làm thế nào và ở đâu thư mục site-packages
được thiết lập và bởi ai?
Thư mục site-packages
được tạo ra trong quá trình cài đặt Python và thường nằm trong thư mục lib
của cài đặt Python của bạn. Vị trí chính xác phụ thuộc vào hệ điều hành của bạn và cách Python được cài đặt.
Ví dụ, trên một cài đặt Linux thông thường, thư mục site-packages
có thể nằm tại:
/usr/local/lib/python3.x/site-packages
Trên Windows, nó có thể nằm tại:
C:\Python3x\Lib\site-packages
Khi bạn cài đặt một gói bằng pip
, nó sẽ được cài đặt trong thư mục site-packages
, cho phép bạn nhập gói mà không cần chỉ định vị trí của nó.
python
import site
print(site.getsitepackages())
🤨🔍 Khi nào và ở đâu trình thông dịch Python đọc file site.py
?
File site.py
(nằm trong thư viện tiêu chuẩn) được thực thi tự động khi trình thông dịch Python khởi động. Nó chịu trách nhiệm thiết lập thư mục site-packages
và thêm nó vào sys.path
. File này nằm trong thư viện tiêu chuẩn của cài đặt Python của bạn.
sys.path trong IRIS
Trong IRIS, chúng ta cũng có một file site.py
, nằm trong <installation_directory>/lib/python/iris_site.py
. File này được thực thi khi bạn khởi động hoặc nhập một script/module trong IRIS, và nó thiết lập sys.path
cho bạn.
Tóm lại, file iris_site.py
thực hiện các tác vụ sau:
- giữ thư mục
site-packages
mặc định - thêm thư mục
<installation_directory>/lib/python/
vàosys.path
- thêm thư mục
<installation_directory>/mgr/python/
vàosys.path
- thêm chuỗi cấu hình PythonPath vào
sys.path
Thực hành tốt nhất khi làm việc với Module
- Sử dụng tên file theo quy tắc
snake_case
để dễ đọc và dễ hiểu. - Tránh đặt tên class và file trùng nhau.
- Luôn kiểm tra
sys.path
để đảm bảo module của bạn có thể được nhập.
Các cạm bẫy phổ biến khi sử dụng Module
- Nhập module không tồn tại trong
sys.path
. - Không hiểu cách hoạt động của file
__init__.py
dẫn đến nhập không đúng. - Các vấn đề với phiên bản Python khác nhau và đường dẫn khác nhau.
Kết luận
Một module có thể là:
- Một file Python (với hoặc không có phần mở rộng
.py
) - Một thư mục với file
__init__.py
- Một script Python (cũng là một module)
- Nếu bạn không thể nhập một module, hãy kiểm tra xem nó có trong danh sách
sys.path
không.
Câu hỏi thường gặp
H1: Làm thế nào để tạo một module trong Python?
Để tạo một module, bạn chỉ cần tạo một file Python với các hàm và lớp bạn muốn sử dụng.
H2: Tôi có thể nhập nhiều module cùng một lúc không?
Có, bạn có thể nhập nhiều module bằng cách sử dụng dấu phẩy trong câu lệnh import
.
H3: Có cần thiết phải có file __init__.py
trong thư mục không?
Không bắt buộc, nhưng nó giúp Python nhận diện thư mục như một module.