Python: Module

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Module cho phép bạn tổ chức hợp lý mã lệnh Python của mình, nhóm mã lệnh liên quan thành một module làm cho mã lệnh dễ hiểu và dễ sử dụng hơn. Module là một đối tượng Python với các thuộc tính được đặt tên tùy ý mà bạn có thể liên kết và tham chiếu.

Đơn giản, một module là một tệp bao gồm mã lệnh Python. Trong module có thể bao gồm các hàm, lớp, biến, khối lệnh.

Ví dụ

Đoạn lệnh Python sau nằm trong module có tên support thường nằm trong file có tên support.py:

def print_func(par):
   print("Hello:", par)
   return

Câu lệnh import

Bạn có thể sử dụng bất kỳ tệp nguồn Python nào làm mô-đun bằng cách thực hiện câu lệnh import trong một số tệp nguồn Python khác. Cú pháp sau:

import module1[, module2[,... moduleN]

Khi trình thông dịch gặp một câu lệnh import thì nó sẽ nhập mô-đun nếu mô-đun có trong đường dẫn tìm kiếm. Đường dẫn tìm kiếm là danh sách các thư mục mà trình thông dịch tìm kiếm trước khi đưa vào mô-đun. Ví dụ: để đưa vào mô-đun support.py, bạn cần đặt lệnh sau ở đầu tập lệnh:

# Import module support
import support

#Giờ ta có thể gọi hàm có trong module như sau:
support.print_func("Zara")

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

Hello : Zara

Mô-đun chỉ được tải một lần, bất kể số lần nó được đưa vào là bao nhiêu. Điều này sẽ ngăn việc thực thi mô-đun lặp đi lặp lại nếu có nhiều lần thực thi import xảy ra.

Câu lệnh from...import

Câu lệnh from của Python cho phép bạn nhập các thuộc tính cụ thể từ một mô-đun vào không gian tên hiện tại. Cú pháp như sau:

from tên_module import name1[, name2[, ... nameN]]

Ví dụ: để import hàm fibonacci() từ mô-đun fib chẳng hạn, hãy sử dụng câu lệnh sau:

from fib import fibonacci

Câu lệnh này không import toàn bộ mô-đun fib vào không gian tên hiện tại; nó chỉ import hàm fibonacci() từ mô-đun fib vào bảng ký hiệu chung của mô-đun nhập.

Câu lệnh from...import *

Ta cũng có thể nhập tất cả các tên từ một mô-đun vào không gian tên hiện tại bằng cách sử dụng câu lệnh nhập sau:

from tên_module import *

Điều này sẽ cung cấp một cách dễ dàng để nhập tất cả các mục từ một mô-đun vào không gian tên hiện tại; tuy nhiên, câu lệnh này nên được sử dụng một cách có chọn lọc nếu không có thể làm giảm hiệu năng của chương trình.

Vị trí mô-đun

Khi bạn nhập một mô-đun, trình thông dịch Python sẽ tìm kiếm mô-đun theo các trình tự sau:

  • Thư mục hiện tại.
  • Nếu không tìm thấy mô-đun, thì Python sẽ tìm kiếm từng thư mục trong biến shell PYTHONPATH.
  • Nếu vẫn thất bại, Python sẽ kiểm tra đường dẫn mặc định. Trên UNIX, đường dẫn mặc định này thường là /usr/local/lib/python/.

Đường dẫn tìm kiếm mô-đun được lưu trữ trong mô-đun hệ thống sys dưới dạng biến sys.path. Biến sys.path chứa thư mục hiện tại, PYTHONPATH và giá trị mặc định phụ thuộc vào cài đặt.

Biến PYTHONPATH

PYTHONPATH là một biến môi trường, bao gồm một danh sách các thư mục. Cú pháp của PYTHONPATH giống như cú pháp của biến shell PATH.

Dưới đây thể hiện một PYTHONPATH điển hình từ hệ thống Windows:

set PYTHONPATH = c:\python20\lib;

Còn dưới đây là một PYTHONPATH điển hình từ hệ thống UNIX:

set PYTHONPATH = /usr/local/lib/python

Namespace và phạm vi

Biến là tên (định danh) ánh xạ tới các đối tượng. Không gian tên là một từ điển của các tên biến (khóa) và các đối tượng (giá trị) tương ứng của chúng.

Một câu lệnh Python có thể truy cập các biến trong không gian tên cục bộ và trong không gian tên chung. Nếu một biến cục bộ và một biến toàn cục có cùng tên, thì biến cục bộ sẽ phủ bóng lên biến toàn cục, hay nói cách khác biến cục bộ sẽ được ưu tiên sử dụng.

Mỗi hàm có không gian tên cục bộ riêng của nó. Các phương thức lớp tuân theo quy tắc xác định phạm vi giống như các hàm thông thường.

Python đưa ra các phỏng đoán về việc các biến là cục bộ hay toàn cục. Nó giả định rằng bất kỳ biến nào được gán giá trị trong một hàm là cục bộ.

Do đó, để gán giá trị cho một biến toàn cục trong một hàm, trước tiên bạn phải sử dụng câu lệnh global.

Câu lệnh global VarName cho Python biết rằng VarName là một biến toàn cục. Khi đó Python sẽ ngừng tìm kiếm không gian tên cục bộ cho biến.

Ví dụ, ta định nghĩa một biến Money trong không gian tên chung. Trong hàm Money, ta gán cho Money một giá trị, do đó Python hiểu Money là một biến cục bộ. Tuy nhiên, ta đã truy cập giá trị của biến cục bộ Money trước khi đặt giá trị cho nó, vì vậy kết quả là một lỗi xảy ra, UnboundLocalError. Ở đoạn mã dưới đây, bạn bỏ chú thích ở câu lệnh global sẽ khắc phục được sự cố.

Money = 2000
def AddMoney():
   # Uncomment the following line to fix the code:
   # global Money
   Money = Money + 1

print Money
AddMoney()
print Money

Hàm dir()

Hàm tích hợp dir() trả về một danh sách các chuỗi đã được sắp xếp có chứa các tên được định nghĩa bởi một mô-đun.

Danh sách chứa tên của tất cả các mô-đun, biến và hàm được định nghĩa trong một mô-đun. Sau đây là một ví dụ đơn giản:

# Import module math có sẵn
import math

content = dir(math)
print(content)

Khi đoạn mã trên được thực thi, nó tạo ra kết quả 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']

Ở đây, biến chuỗi đặc biệt __name__ là tên của mô-đun và __file__ là tên tệp mà từ đó mô-đun đã được tải.

Các hàm globals() và local()

Các hàm globals() và locals() có thể được sử dụng để trả về các tên trong không gian tên toàn cục và cục bộ tùy thuộc vào vị trí nơi chúng được gọi.

Nếu locals() được gọi từ bên trong một hàm, nó sẽ trả về tất cả các tên có thể được truy cập cục bộ từ hàm đó.

Nếu globals() được gọi từ bên trong một hàm, nó sẽ trả về tất cả các tên có thể được truy cập trên toàn cục từ hàm đó.

Kiểu trả về của cả hai hàm này là từ điển (dictionary). Do đó, các tên có thể được trích xuất bằng cách sử dụng hàm key().

Hàm reload()

Nhắc lại rằng khi mô-đun được import vào một tập lệnh, thì mã trong phần cấp cao nhất của mô-đun chỉ được thực thi một lần.

Do đó, nếu bạn muốn thực thi lại mã cấp cao nhất trong một mô-đun, bạn có thể sử dụng hàm reload(). Hàm reload() sẽ import lại một mô-đun đã nhập trước đó. Cú pháp của hàm reload() là:

reload(module_name)

Ở đây, module_name là tên của mô-đun bạn muốn tải lại và không phải là chuỗi chứa tên mô-đun. Ví dụ: để tải lại mô-đun hello, hãy làm như sau:

reload(hello)

Các gói trong Python

Gói là một cấu trúc thư mục tệp phân cấp xác định một môi trường ứng dụng Python duy nhất bao gồm các mô-đun và các gói con và gói cháu, v.v.

Xét một tệp Pots.py có sẵn trong thư mục Phone. Tệp này có dòng mã nguồn sau:

def Pots():
   print("I'm Pots Phone")

Theo cách tương tự, chúng ta có hai tệp khác có các chức năng khác nhau có cùng tên như trên:

  • Tệp Phone/Isdn.py có hàm Isdn()
  • Tệp Phone/G3.py có hàm G3()

Bây giờ, hãy tạo thêm một tệp __init__.py trong thư mục Phone:

  • Phone/__init__.py

Để cung cấp tất cả các hàm khi import Phone, ta cần đặt các câu lệnh import rõ ràng trong __init__.py như sau:

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

Sau khi bạn thêm các dòng này vào __init__.py, bạn sẽ có tất cả các lớp này khi import gói Phone.

# import gói Phone.
import Phone

Phone.Pots()
Phone.Isdn()
Phone.G3()

Khi đoạn mã trên được thực thi, nó tạo ra kết quả sau:

I'm Pots Phone
I'm 3G Phone
I'm ISDN Phone

Trong ví dụ trên, ta đã lấy ví dụ về một hàm duy nhất trong mỗi tệp, nhưng bạn có thể giữ nhiều hàm trong tệp của mình. Bạn cũng có thể xác định các lớp Python khác nhau trong các tệp đó và sau đó bạn có thể tạo các gói của mình từ các lớp đó.

» Tiếp: I/O File
« Trước: Date và Time
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!