PHP
Python

Trang chủ

Tìm hiểu về Module trong Python

Ngôn ngữ Python là một ngôn ngữ lập trình đa mục đích, nổi tiếng với cú pháp dễ đọc, dễ học và tính ứng dụng cao. Trong lĩnh vực phát triển web, Python thường được sử dụng thông qua các framework như Django và Flask để xây dựng các ứng dụng web mạnh mẽ, bảo mật và dễ mở rộng. Trong chuyên mục này, Vietnix không chỉ cung cấp kiến thức nền tảng về ngôn ngữ Python mà còn hướng dẫn chi tiết cách xây dựng các ứng dụng web thực tế, sử dụng các framework phổ biến và áp dụng các kỹ thuật tiên tiến. Vietnix cam kết liên tục cập nhật những bài viết mới nhất về các tính năng mới của Python, các thư viện hỗ trợ hữu ích và những phương pháp tốt nhất, giúp bạn khai thác tối đa sức mạnh của Python và hoàn thiện kỹ năng lập trình web của mình.
html
CSS
javascript
sql
python
php
c
c++
bootstrap
react
mysql
reactjs
vuejs
Javascript Tutorials
13/01/2025
26 phút đọc
Theo dõi Vietnix trên

Tìm hiểu về Module trong Python

Module là một file chứa các định nghĩa và lệnh Python, cho phép bạn tổ chức mã nguồn thành các khối logic. Bài viết này mình sẽ chia sẻ cho bạn các thông tin cơ bản về khái niệm module, cách module hoạt động và một số ví dụ cụ thể.

Module trong Python là gì?

Module trong Python là một file chứa code Python, có thể bao gồm các định nghĩa về hàm, lớp, biến và các đối tượng khác. Module giúp chia nhỏ và tổ chức code thành các phần có chức năng riêng biệt, làm cho code dễ quản lý, dễ tái sử dụng và dễ bảo trì hơn.

Hàm trong Python là một khối mã lệnh được tổ chức và có thể tái sử dụng, được dùng để thực hiện một hành động hoặc nhiệm vụ cụ thể. Hàm giúp cho code có cấu trúc tốt hơn, dễ dàng tái sử dụng, giảm sự trùng lặp, và giúp việc bảo trì code dễ dàng hơn.

image 41
Tìm hiểu về Module trong Python 4

Ví dụ

Để thấy rõ cách module hoạt động, xem qua ví dụ sử dụng một module có tên random (module này thường có sẵn trong Python) để tạo một số ngẫu nhiên.

import random

# In ra 1 số nguyên ngẫu nhiên trong khoảng 1 đến 10
print("Số ngẫu nhiên từ 1 đến 10:", random.randint(1, 10))
#In ra 1 số thập phân ngẫu nhiên từ 0 đến 1
print ("Số thập phân ngẫu nhiên từ 0 đến 1", random.random())

Khi chạy đoạn code, bạn sẽ thấy kết quả sau:

Số ngẫu nhiên từ 1 đến 10: <một số nguyên ngẫu nhiên>

Số thập phân ngẫu nhiên từ 0 đến 1: <một số thập phân ngẫu nhiên>

Giải thích code:

  • import random: Lệnh này tải toàn bộ code từ module random để sử dụng trong chương trình.
  • print("Số ngẫu nhiên từ 1 đến 10:", random.randint(1, 10)): Dòng code này sử dụng hàm randint() từ module random để tạo ra một số nguyên ngẫu nhiên nằm trong khoảng từ 1 đến 10 (bao gồm cả 1 và 10). Sau đó, in ra kết quả.
  • print ("Số thập phân ngẫu nhiên từ 0 đến 1", random.random()): Dòng code này sử dụng hàm random() (không có int ở cuối) từ module random để tạo ra một số thập phân ngẫu nhiên lớn hơn hoặc bằng 0, nhỏ hơn 1. Sau đó, in ra kết quả.

Module do người dùng định nghĩa trong Python

Trong Python, bất kỳ file văn bản nào có phần mở rộng .py và chứa mã Python đều được xem là một module. Đây là nơi bạn có thể định nghĩa một hoặc nhiều hàm (function), biến (variable), hằng số (constant) hoặc thậm chí là các lớp (class). Để sử dụng các đối tượng (object) trong một module ở một phiên làm việc trình thông dịch (interpreter session) hoặc trong một script Python khác, chúng ta cần sử dụng lệnh import. Một module cũng có thể chứa các đoạn code có thể thực thi.

Các module được tích hợp sẵn trong Python

Python có một thư viện chuẩn rất phong phú, đi kèm với vô số các module. Các module này được gọi là các module tích hợp sẵn. Hầu hết các module này được viết bằng ngôn ngữ C (vì Python được viết dựa trên C), và được biên dịch trước thành thư viện. Các module tích hợp sẵn này chứa các chức năng rất hữu ích, bao gồm quản lý hệ điều hành, thao tác I/O trên ổ đĩa, mạng,…

Dưới đây là danh sách một số module tích hợp sẵn phổ biến:

ModulesMô tả
osModule này cung cấp một giao diện thống nhất để tương tác với các chức năng khác nhau của hệ điều hành.
stringModule này chứa nhiều hàm để xử lý chuỗi ký tự.
reModule  này cung cấp các công cụ mạnh mẽ để làm việc với biểu thức chính quy. Biểu thức chính quy (RegEx) cho phép tìm kiếm và so khớp các mẫu trong chuỗi một cách linh hoạt và hiệu quả.
mathModule này triển khai các phép toán toán học với số thực dấu phẩy động. Các hàm trong module này thường chỉ là lớp bao ngoài các hàm của thư viện C.
cmathModule này chứa các hàm toán học cho số phức.
datetimeModule này cung cấp các chức năng để xử lý ngày và thời gian trong ngày. Thường dùng thư viện runtime C.
gcModule này cung cấp một giao diện để tương tác với bộ thu gom rác (garbage collector) tích hợp của Python.
asyncioModule này định nghĩa các chức năng cần thiết cho việc xử lý bất đồng bộ.
collectionsModule này cung cấp các kiểu dữ liệu container nâng cao hơn, như namedtuple, deque và Counter.
functoolsModule này cung cấp các hàm bậc cao và các thao tác trên các đối tượng gọi được (callable). Hữu ích trong lập trình hàm.
operatorModule này chứa các hàm tương ứng với các toán tử chuẩn trong Python.
pickleModule này cho phép chuyển đổi các đối tượng Python thành luồng byte và ngược lại.
socketModule này cung cấp một giao diện cấp thấp cho mạng máy tính.
sqlite3Module này cung cấp giao diện DB-API 2.0 sử dụng SQLite 3.x.
statisticsModule này cung cấp các hàm thống kê toán học.
typingModule này hỗ trợ gợi ý kiểu dữ liệu.
venvModule này dùng để tạo các môi trường ảo.
jsonModule này hỗ trợ mã hóa và giải mã định dạng JSON.
wsgirefModule này cung cấp các tiện ích WSGI và cách triển khai tham chiếu.
unittestModule này cung cấp framework để viết các unit test.
randomModule này tạo ra các số giả ngẫu nhiên.
sysModule này cung cấp các hàm tương tác mạnh mẽ với trình thông dịch Python.
23Mocule này này đơn giản hóa các yêu cầu HTTP, cung cấp một giao diện thân thiện để gửi yêu cầu và xử lý phản hồi.

Tạo module trong Python

Việc tạo ra một module trong Python thực sự đơn giản, chỉ là việc lưu code Python vào một tệp. Hãy cùng tạo một module đơn giản bằng cách lưu đoạn code sau vào tệp có tên my_module.py (bạn có thể chọn tên khác nếu muốn):

def thong_bao(message):
    print("Thông báo:", message)

def tinh_tong(a, b):
    return a + b

Bạn có thể sử dụng module vừa tạo ở phiên làm việc của Python hoặc trong một script khác bằng cách sử dụng lệnh import. Ví dụ, bạn hãy mở Python terminal và làm theo các bước sau:

>>> import my_module
>>> my_module.thong_bao("Chào mừng bạn đến với Python!")
Thông báo: Chào mừng bạn đến với Python!
>>> print(my_module.tinh_tong(5, 3))
8

Ngoài ra, chúng ta hoàn toàn có thể dùng một module ở một file Python script khác. Bạn hãy tạo thêm file vi_du.py và ghi nội dung sau vào:

import my_module

my_module.thong_bao("Python thật tuyệt vời!")
ket_qua = my_module.tinh_tong(10, 2)
print("Kết quả:", ket_qua)

Bây giờ bạn hãy chạy vi_du.py trên command line:

python vi_du.py

Kết quả:

Thông báo: Python thật tuyệt vời!

Kết quả: 12

Giải thích code:

  • Trong file my_module.py chúng ta định nghĩa 2 function thong_bao dùng để in ra một thông báo nào đó và tinh_tong dùng để tính tổng hai số a, b.
  • Khi import my_module chúng ta hoàn toàn có thể dùng lại các hàm này trong vi_du.py

Câu lệnh import trong Python

Trong Python, từ khóa import cho phép chúng ta nạp các đối tượng (object) từ một module (module) khác. Đối tượng ở đây có thể là một hàm (function), một lớp (class), hoặc một biến (variable),… Khi một module có nhiều định nghĩa bên trong, tất cả chúng sẽ được nạp vào không gian tên (namespace) hiện tại.

Ví dụ

Chúng ta sẽ tạo một module có tên là calculator.py có 3 hàm: tính tổng, tính trung bình, tính lũy thừa

# calculator.py

def tinh_tong(a, b):
   return a + b

def tinh_trung_binh(a, b):
   return (a + b) / 2

def tinh_luy_thua(a, b):
   return a ** b

Câu lệnh import calculator sẽ nạp tất cả các hàm vào trong không gian tên của chương trình hiện tại, chúng ta sẽ truy cập các function đó thông qua module object (chính là calculator). Để kiểm tra các thuộc tính của module calculator vừa import ta dùng hàm dir()

>>> import calculator
>>> dir(calculator)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'tinh_luy_thua', 'tinh_tong', 'tinh_trung_binh']

Như bạn thấy ở trên, trong calculator module object chúng ta có thể thấy các thuộc tính là các function chúng ta đã định nghĩa trước đó, chúng ta có thể truy cập chúng theo cú pháp tên_module.tên_function. Tiếp theo, chúng ta sẽ tạo file main.py và dùng module calculator

# main.py
import calculator

print ("Tổng:", calculator.tinh_tong(10, 20))
print ("Trung bình:", calculator.tinh_trung_binh(10, 20))
print ("Lũy thừa:", calculator.tinh_luy_thua(10, 2))

Khi chạy file main.py ta được kết quả như sau:

Tổng: 30

Trung bình: 15.0

Lũy thừa: 100

Giải thích code:

  • Trong module calculator.py, chúng ta định nghĩa 3 hàm toán học là
    tinh_tong, tinh_trung_binh, tinh_luy_thua.
  • Trong main.py sử dụng câu lệnh import calculator để sử dụng các hàm vừa định nghĩa ở file calculator.py.
  • Để dùng các function chúng ta sử dụng cú pháp tên_module.tên_function(tham số)

Lệnh from … import

Lệnh import thông thường sẽ tải toàn bộ tài nguyên của một module vào không gian tên hiện tại. Tuy nhiên, đôi khi bạn chỉ cần sử dụng một vài đối tượng cụ thể (như hàm, biến, class) từ module đó. Để làm được điều này, bạn có thể sử dụng cú pháp from … import. Cú pháp này cho phép bạn nhập trực tiếp những đối tượng mong muốn từ một module vào chương trình hiện tại.

Ví dụ chúng ta có một module là my_module.py như sau:

def tong(a, b):
    return a + b

def hieu(a, b):
    return a - b

def tich(a, b):
    return a * b

Thay vì nhập tất cả các hàm trong my_module như import my_module chúng ta có thể nhập các hàm tong, hieu bằng cách sử dụng from my_module import và kết quả sẽ được thấy rõ khi chạy file vi_du.py dưới đây

from my_module import tong, hieu

print ("Tổng:", tong(10, 5))
print ("Hiệu:", hieu(10,5))

Khi chạy file vi_du.py chúng ta nhận được kết quả:

Tổng: 15

Hiệu: 5

Giải thích code:

  • Ở file my_module.py: Chúng ta có 3 function là tong, hieu, tich.
  • Ở file vi_du.py: Chúng ta chỉ dùng lại function tong, hieu từ module my_module bằng câu lệnh from my_module import tong, hieu. Như vậy hàm tich đã không còn liên quan tới code hiện tại.
  • Do chúng ta đã import cụ thể hàm từ module my_module: Nên khi gọi các hàm này ta không cần thêm my_module.

Lệnh from … import *

Trong Python, bạn cũng có thể nhập (import) tất cả các tên (hàm, biến,…) từ một module (module) vào không gian tên (namespace) hiện tại bằng cách sử dụng câu lệnh from ... import * như sau:

from <tên_module> import *

Câu lệnh này giúp chúng ta dễ dàng import tất cả các đối tượng từ một module, tuy nhiên, cần lưu ý sử dụng một cách hạn chế.

Lệnh import … as

Khi bạn sử dụng lệnh import để nạp một module (module), bạn có thể gán cho module đó một tên bí danh (alias) ngắn gọn hơn, dễ sử dụng hơn. Cú pháp như sau:

import ten_module as bi_danh

Khi đã có bí danh, bạn sẽ dùng tên bí danh thay cho tên thật của module khi gọi đến các hàm, biến hay các đối tượng khác bên trong. Việc này giúp code trở nên ngắn gọn và dễ đọc hơn, đặc biệt khi làm việc với các module có tên dài.

Để làm rõ hơn, hãy cùng xem xét một ví dụ. Trước hết, ta cần có một module trước, bạn có thể tạo file my_module.py có nội dung sau:

def sum_numbers(a, b):
    return a + b

def calculate_average(a, b):
    return (a + b) / 2

def exponentiate(base, exponent):
    return base ** exponent

Giả sử trong chương trình chính, bạn muốn sử dụng các hàm sum_numbers, calculate_average, exponentiate, nhưng muốn đặt tên ngắn gọn cho module my_module bạn sẽ dùng import… as:

import my_module as calculator

result_sum = calculator.sum_numbers(10, 5)
result_average = calculator.calculate_average(10, 5)
result_power = calculator.exponentiate(2, 4)


print ("Tổng:", result_sum)
print ("Trung bình:", result_average)
print ("Lũy thừa:", result_power)

Giải thích code:

  • import my_module as calculator: Câu lệnh này nhập (import) module my_module và gán bí danh calculator cho nó.
  • calculator.sum_numbers(10, 5), calculator.calculate_average(10, 5), calculator.exponentiate(2, 4): Các dòng lệnh này sử dụng tên bí danh calculator để gọi đến các hàm bên trong module my_module. Thay vì phải gọi my_module.sum_numbers, giờ bạn chỉ cần calculator.sum_numbers, code sẽ ngắn gọn hơn nhiều.
  • Các câu lệnh print để hiển thị kết quả.

Xác định vị trí của Module

Khi bạn sử dụng lệnh import để đưa một module vào chương trình, trình thông dịch Python sẽ tìm kiếm module đó theo một trình tự ưu tiên nhất định. Thứ tự tìm kiếm này giúp Python biết chính xác cần tìm module ở đâu để có thể sử dụng các chức năng được định nghĩa bên trong.

Trình tự tìm kiếm module của Python như sau:

  • Thư mục hiện tại: Đầu tiên, Python sẽ tìm kiếm module trong thư mục đang chứa script Python mà bạn đang chạy. Điều này có nghĩa, nếu file chứa module và file đang chạy ở cùng một chỗ, Python sẽ tìm thấy file này một cách dễ dàng.
  • Biến môi trường PYTHONPATH: Nếu không tìm thấy module ở thư mục hiện tại, Python sẽ tiếp tục tìm trong các thư mục được liệt kê trong biến môi trường PYTHONPATH. PYTHONPATH là một biến môi trường mà bạn có thể thiết lập để chỉ định các đường dẫn thư mục chứa các module. Nếu bạn thường xuyên dùng những module tự tạo, bạn có thể thiết lập đường dẫn ở đây để Python luôn tìm ra chúng.
  • Đường dẫn mặc định: Trong trường hợp vẫn không tìm thấy module, Python sẽ kiểm tra các đường dẫn mặc định của hệ thống. Thông thường, trên các hệ thống UNIX (như Linux hoặc macOS), đường dẫn mặc định này sẽ là /usr/local/lib/python/. Đường dẫn mặc định thường chứa các module được cài đặt sẵn trong hệ thống.

Mở rộng thêm về sys.path:

Đường dẫn tìm kiếm module (module) thực tế được lưu trữ trong biến sys.path thuộc module (module) sys. Biến này chứa một danh sách các đường dẫn mà Python sẽ tìm kiếm, bao gồm thư mục hiện tại, các thư mục trong PYTHONPATH và đường dẫn mặc định. Chúng ta hoàn toàn có thể xem các đường dẫn đó bằng đoạn code như sau:

import sys
print(sys.path)

Biến môi trường PYTHONPATH

Biến môi trường, nói một cách đơn giản, là những biến có thể được truy cập và sử dụng bởi hệ điều hành cũng như các chương trình khác. PYTHONPATH là một biến môi trường đặc biệt quan trọng trong Python. Khi bạn sử dụng lệnh import để nạp một module, Python sẽ tìm kiếm module đó trong các thư mục được chỉ định trong biến môi trường PYTHONPATH. Nếu không tìm thấy module ở bất kì thư mục nào, Python sẽ báo lỗi.

Dưới đây là một ví dụ về PYTHONPATH điển hình trên hệ thống Windows:

set PYTHONPATH = c:\python20\lib;

Còn đây là một ví dụ PYTHONPATH điển hình trên hệ thống UNIX (Linux, macOS):

set PYTHONPATH = /usr/local/lib/python

Namespaces và Scoping

Trong Python, biến là các tên (còn gọi là định danh) được liên kết đến các đối tượng trong bộ nhớ. Một không gian tên (namespace) là một dạng từ điển (dictionary), nơi các tên biến (khóa) được ánh xạ đến các đối tượng tương ứng (giá trị).

  • Một câu lệnh trong Python có thể truy cập đến các biến nằm trong không gian tên cục bộ (local namespace) và không gian tên toàn cục (global namespace). Nếu một biến cục bộ và một biến toàn cục có cùng tên, biến cục bộ sẽ “che phủ” biến toàn cục, tức là khi truy cập đến tên biến đó, Python sẽ ưu tiên biến cục bộ.
  • Mỗi hàm (function) đều có không gian tên cục bộ riêng. Các phương thức của lớp (class methods) cũng tuân theo quy tắc phạm vi hoạt động tương tự như các hàm thông thường.
  • Python khá thông minh khi phán đoán xem một biến là cục bộ hay toàn cục. Python mặc định coi một biến được gán giá trị bên trong một hàm là biến cục bộ.
  • Để gán giá trị cho một biến toàn cục bên trong hàm, trước hết bạn cần sử dụng từ khóa global.
  • Câu lệnh global VarName thông báo cho Python biết rằng VarName là một biến toàn cục. Khi đó, Python sẽ không tìm kiếm biến này trong không gian tên cục bộ nữa.

Ví dụ

Để hiểu rõ hơn về cách Python quản lý không gian tên, hãy xem xét ví dụ sau:

Chúng ta có một biến tien (Money) được định nghĩa trong không gian tên toàn cục. Bên trong hàm tang_tien, chúng ta lại gán giá trị mới cho tien. Do đó, Python sẽ hiểu rằng tien bên trong hàm tang_tien là một biến cục bộ. Tuy nhiên, khi truy cập giá trị của biến tien cục bộ này trước khi gán cho nó, sẽ dẫn đến lỗi UnboundLocalError. Việc bỏ ghi chú (uncomment) dòng lệnh global tien sẽ giúp sửa lỗi này.

tien = 2000

def tang_tien():
   # Bỏ dấu comment dòng sau để sửa lỗi:
   # global tien
    tien = tien + 1
   

print(tien)
tang_tien()
print(tien)

Khi thực thi đoạn mã này (nếu chưa bỏ comment), Python sẽ báo lỗi, cụ thể:

2000

UnboundLocalError: cannot access local variable ‘tien’ where it is not associated with a value

Tuy nhiên nếu bạn bỏ ghi chú global tien thì kết quả trả ra sẽ khác:

2000

2001

Thuộc tính của Module

Trong Python, một module là một đối tượng thuộc lớp module, và do đó, mỗi module sẽ có những thuộc tính riêng. Để hiểu rõ hơn, chúng ta hãy cùng khám phá một vài thuộc tính phổ biến:

Các module trong Python cũng giống như những chiếc hộp đựng các công cụ, và mỗi chiếc hộp đó lại có các thông tin như sau:

  • __file__: Thuộc tính này sẽ cho chúng ta biết vị trí vật lý của module đó, tức là module được lưu trữ ở đâu trong máy tính của bạn. Nó giống như địa chỉ nhà của module vậy.
  • __package__: Khi module thuộc về một gói (package), thuộc tính này sẽ chỉ định tên của gói đó. Gói ở đây giống như một thư mục lớn chứa nhiều module có liên quan với nhau.
  • __doc__: Khi người lập trình tạo ra một module, họ thường thêm vào một đoạn mô tả ngắn gọn ở đầu file, gọi là “docstring”. Thuộc tính __doc__ sẽ giúp chúng ta xem được nội dung của đoạn mô tả này, giống như là ghi chú hướng dẫn sử dụng cho module đó.
  • __dict__: Đây là một thuộc tính đặc biệt, nó trả về toàn bộ không gian tên (namespace) của module. Nghĩa là, chúng ta có thể xem được danh sách các biến, hàm, class, và tất cả các “đồ vật” mà module đó đang giữ trong “túi” của nó.
  • __name__: Thuộc tính này cho chúng ta biết tên của module đó. Khi chúng ta import một module, chúng ta thường sử dụng tên của module đó, đây chính là tên được trả về bởi thuộc tính __name__.

Ví dụ

Giả sử rằng đoạn code dưới đây được lưu vào file mymodule.py

"""Đây là tài liệu hướng dẫn của module mymodule"""
def tinh_tong(x, y):
    """Hàm tính tổng của hai số x và y."""
    return x + y

def tinh_trung_binh(x, y):
    """Hàm tính trung bình của hai số x và y."""
    return (x + y) / 2

def tinh_luy_thua(x, y):
  """Hàm tính lũy thừa của x lên y."""
  return x**y

Ta hãy kiểm tra các thuộc tính của module mymodule bằng cách nhập (import) nó vào một script khác:

import mymodule

print ("Thuộc tính __file__:", mymodule.__file__)
print ("Thuộc tính __doc__:", mymodule.__doc__)
print ("Thuộc tính __name__:", mymodule.__name__)

Đoạn mã trên khi chạy sẽ tạo ra kết quả:

Thuộc tính __file__: C:\math\examples\mymodule.py

Thuộc tính __doc__: Đây là tài liệu hướng dẫn của module mymodule

Thuộc tính __name__: mymodule

Thuộc tính __name__

Thuộc tính __name__ của một module Python có ý nghĩa rất quan trọng. Hãy cùng tìm hiểu chi tiết hơn về nó.

Trong trình thông dịch Python (interactive shell), thuộc tính __name__ trả về giá trị '__main__'.

>>> __name__
'__main__'

Nếu bạn nhập (import) một module nào đó trong phiên làm việc với trình thông dịch, __name__ của module đó sẽ trả về tên của module.

>>> import math
>>> math.__name__
'math'

Từ bên trong một file script Python, thuộc tính __name__ cũng trả về giá trị ‘__main__‘.

#example.py
print ("Thuộc tính __name__ trong một script:", __name__)

Chạy đoạn code trên trong cửa sổ dòng lệnh (command terminal), bạn sẽ thấy kết quả:

Thuộc tính __name__ trong một script: __main__

Thuộc tính này cho phép một script Python vừa có thể chạy trực tiếp như một chương trình, vừa có thể được nhập vào như một module. Không giống như trong các ngôn ngữ lập trình C++, Java, C#, trong Python, không có khái niệm hàm main(). Một file script Python với phần mở rộng .py có thể chứa cả định nghĩa hàm (function definitions) và các câu lệnh thực thi (executable statements).

Bây giờ, hãy lưu một file có tên mymodule.py với nội dung code sau:

""" Đây là docstring của module mymodule """
def sum(x, y):
    """Hàm tính tổng hai số"""
    return x + y

print ("sum:", sum(10, 20))

Trong mymodule.py bạn có thể thấy hàm sum() được gọi ngay trong chính module đó, và kết quả in ra màn hình như sau:

sum: 30

Bây giờ, chúng ta hãy thử import hàm sum() từ module mymodule.py này vào một script (file Python) khác, giả sử tên là example.py.

# file example.py
import mymodule
print ("sum:", mymodule.sum(10, 20))

Khi chạy file example.py kết quả hiển thị sẽ là:

sum: 30

sum: 30

Ta thấy kết quả “sum: 30” xuất hiện hai lần. Một lần khi module mymodule được import, các lệnh có thể thực thi trong module đó cũng sẽ chạy. Lần thứ hai là từ lệnh gọi hàm trong file example.py

Tuy nhiên, chúng ta mong muốn rằng khi một module được import, thì chỉ có các hàm (hay các đối tượng) bên trong module được nhập vào, chứ các lệnh thực thi của module đó không nên chạy. Để làm được điều này, chúng ta cần kiểm tra giá trị của biến __name__. Nếu giá trị của __name____main__, thì điều đó có nghĩa là module đang được chạy trực tiếp, chứ không phải đang được import. Hãy bao các lệnh thực thi như lệnh gọi hàm có điều kiện, và chỉ cho nó chạy khi biến __name__ có giá trị là __main__

Hãy thêm câu lệnh if vào file mymodule.py như sau:

"""The docstring of mymodule"""
def sum(x, y):
    return x + y

if __name__ == "__main__":
    print("sum:", sum(10, 20))

Bây giờ, nếu bạn chạy chương trình example.py (nếu bạn đã import module này ở file example.py thì kết quả mới đúng), bạn sẽ thấy dòng sum: 30 chỉ xuất hiện một lần.

sum: 30

Hàm dir ()

Trong Python, hàm dir() là một hàm dựng sẵn (built-in function) có khả năng trả về một danh sách các chuỗi đã được sắp xếp, chứa đựng tên của các thành phần được định nghĩa trong một module.

Nói một cách đơn giản hơn, hàm dir() cho bạn biết những cái tên gì (ví dụ: biến, hàm, module con) có sẵn bên trong một module. Danh sách này giúp bạn khám phá nội dung bên trong của một module một cách dễ dàng. Dưới đây là một ví dụ đơn giản để minh họa cách hàm dir() hoạt động:

# Nhập (import) module math
import math

noi_dung = dir(math)
print (noi_dung)

Khi chạy đoạn mã trên, kết quả hiển thị trên màn hình sẽ như sau:

['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log', 'log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']

Hàm reload() trong Python

Trong quá trình làm việc với Python, đặc biệt khi sử dụng trình thông dịch tương tác (interactive interpreter session), đôi khi bạn sẽ cần tải lại một module (hay còn gọi là module). Điều này xảy ra khi bạn muốn sử dụng phiên bản mới nhất của module sau khi đã chỉnh sửa.

Ví dụ bạn có một module kiểm thử (test.py) với hàm sau đây:

def SayHello(name):
    print ("Xin chào {}! Bạn khỏe không?".format(name))
    return

Bạn có thể nhập (import) module này và gọi hàm SayHello() từ giao diện dòng lệnh của Python như sau:

>>> import test

>>> test.SayHello(“Mai”)

Xin chào Mai! Bạn khỏe không?

Tuy nhiên, ví dụ bạn muốn thay đổi hàm SayHello(), sẽ như sau:

def SayHello(name, course):
    print ("Xin chào {}! Bạn khỏe không?".format(name))
    print ("Chào mừng bạn đến với khóa học {} của Học viện ABC".format(course))
    return

Ngay cả khi bạn đã sửa đổi và lưu lại file test.py, hàm đã được tải vào bộ nhớ sẽ không tự động cập nhật. Để sử dụng phiên bản mới nhất của module này, bạn cần tải lại (reload) bằng cách sử dụng hàm reload() từ module imp.

>>> import imp

>>> imp.reload(test)

>>> test.SayHello(“Mai”, “Lập trình Python”)

Xin chào Mai! Bạn khỏe không?

Chào mừng bạn đến với khóa học Lập trình Python của Học viện ABC

Packages trong Python

Trong Python, một Package (gói) là một cấu trúc thư mục (directory) phân cấp, xác định một môi trường ứng dụng Python đơn nhất, bao gồm các module, các subpackage (gói con), các sub-subpackage (gói con của gói con), và cứ thế tiếp diễn.

Bạn có thể hình dung Package như một “tập hợp các ngăn” chứa đựng các module (các file .py chứa code). Package giúp tổ chức code một cách khoa học, dễ quản lý và tái sử dụng.

Ví dụ, bạn có một file Pots.py nằm trong thư mục Phone. File này chứa đoạn mã sau:

def Pots():
    print ("Tôi là Pots Phone")

Tương tự, chúng ta có thêm hai file khác, mỗi file chứa một hàm với cùng tên như trên, nhưng có chức năng khác:

  • File Isdn.py nằm trong thư mục Phone, có chứa hàm Isdn()
  • File G3.py nằm trong thư mục Phone, có chứa hàm G3()

Bây giờ, hãy tạo thêm một file nữa có tên là __init__.py trong thư mục Phone:

  • File __init__.py nằm trong thư mục Phone

Để có thể sử dụng tất cả các hàm đã tạo bên trong một package (ví dụ như Phone package) khi đã import, bạn cần khai báo rõ ràng các import statements trong file __init__.py như sau:

from Pots import Pots
from Isdn import Isdn
from G3 import G3

Sau khi thêm những dòng này vào file __init__.py, bạn sẽ có thể sử dụng tất cả các lớp (classes) bên trong các module này khi import Phone package.

Ví dụ, bạn đã tạo một package có tên Phone và có các module như sau: Pots.py, Isdn.py, và G3.py. Sau khi cấu hình file __init__.py như trên, bạn có thể sử dụng package Phone như sau:

# Import Phone Package.
import Phone

# Gọi đến các class trong package Phone
Phone.Pots()
Phone.Isdn()
Phone.G3()

Khi thực thi đoạn mã trên, kết quả sẽ như sau:

I’m Pots Phone

I’m 3G Phone

I’m ISDN Phone

Lời kết

Vậy là chúng ta đã cùng nhau tìm hiểu chi tiết về Modules trong Python, từ định nghĩa cơ bản đến cách sử dụng và những lợi ích mà module mang lại. Hy vọng những kiến thức này sẽ giúp bạn có cái nhìn rõ ràng hơn về Module, từ đó ứng dụng hiệu quả vào quá trình lập trình Python của mình. Đừng quên thực hành thường xuyên để nắm vững các kiến thức nằm trong bài chia sẻ.

Cao Lê Viết Tiến

PHP Leader
tại
Vietnix

Kết nối với mình qua

Icon Quote
Icon Quote

Học lập trình online cùng vietnix

Học lập trình online cùng Vietnix

PHPXem thêmThu gọn