Chúng tôi đã học được rằng các mô-đun là các tệp chứa các câu lệnh và định nghĩa Python, như định nghĩa hàm và lớp. Chúng ta sẽ học trong chương này cách gộp nhiều mô-đun lại với nhau để tạo thành một gói
Một gói về cơ bản là một thư mục chứa các tệp Python và một tệp có tên
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/a NameError: name 'a' is not defined7. py. Điều này có nghĩa là mọi thư mục bên trong đường dẫn Python chứa tệp có tên
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/a NameError: name 'a' is not defined7. py, sẽ được Python coi là một gói. Có thể đặt nhiều mô-đun vào một Gói
Các gói là một cách cấu trúc không gian tên mô-đun của Python bằng cách sử dụng "tên mô-đun chấm". Một. B là viết tắt của một mô hình con có tên B trong một gói có tên A. Hai gói khác nhau như P1 và P2 đều có thể có các mô-đun có cùng tên, chẳng hạn như A. Mô hình con A của gói P1 và mô hình con A của gói P2 có thể hoàn toàn khác nhau. Một gói được nhập giống như một mô-đun "bình thường". Chúng ta sẽ bắt đầu chương này với một ví dụ đơn giản
Đào tạo Python trực tiếp
Thưởng thức trang này?
Thấy. Tổng quan về các khóa học Python trực tiếp
đăng ký tại đây
Một ví dụ đơn giản
Chúng tôi sẽ minh họa bằng một ví dụ rất đơn giản về cách tạo một gói với một số mô-đun Python. Trước hết, chúng ta cần một thư mục. Tên của thư mục này sẽ là tên của gói mà chúng tôi muốn tạo. Chúng tôi sẽ gọi gói của chúng tôi là "simple_package". Thư mục này cần chứa một tệp có tên
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/a NameError: name 'a' is not defined7. py. Tệp này có thể trống hoặc có thể chứa mã Python hợp lệ. Mã này sẽ được thực thi khi một gói được nhập vào, vì vậy nó có thể được sử dụng để khởi tạo một gói, e. g. để đảm bảo rằng một số mô-đun khác được nhập hoặc một số giá trị được đặt. Bây giờ chúng ta có thể đặt tất cả các tệp Python sẽ là mô hình con của mô-đun của chúng ta vào thư mục này. Chúng tôi tạo hai tệp đơn giản a. py và b. py chỉ vì mục đích lấp đầy gói bằng các mô-đun
nội dung của một. py
def bar[]: print["Hello, function 'bar' from module 'a' calling"]
Nội dung của b. py
def foo[]: print["Hello, function 'foo' from module 'b' calling"]
Chúng tôi cũng sẽ thêm một tệp trống có tên
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/a NameError: name 'a' is not defined7. py bên trong thư mục simple_package
Hãy xem điều gì sẽ xảy ra, khi chúng ta nhập simple_package từ trình bao Python tương tác, giả sử rằng thư mục simple_package nằm trong thư mục mà bạn gọi trình bao hoặc nó được chứa trong đường dẫn tìm kiếm hoặc biến môi trường "PYTHONPATH" [từ hệ điều hành của bạn
import simple_package
simple_package/a
ĐẦU RA
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/a NameError: name 'a' is not defined
simple_package/b
ĐẦU RA
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/b NameError: name 'b' is not defined
Chúng ta có thể thấy rằng gói Simple_package đã được tải nhưng không phải mô-đun "a" hay mô-đun "b". Chúng ta có thể nhập các mô-đun a và b theo cách sau
from simple_package import a, b a.bar[] b.foo[]
ĐẦU RA
Hello, function 'bar' from module 'a' calling Hello, function 'foo' from module 'b' calling
Như chúng ta đã thấy ở đầu chương, chúng ta không thể truy cập cả "a" và "b" bằng cách chỉ nhập simple_package
Tuy nhiên, có một cách để tự động tải các mô-đun này. Chúng ta có thể sử dụng tệp
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/a NameError: name 'a' is not defined7. py cho mục đích này. Tất cả những gì chúng ta phải làm là thêm các dòng sau vào tệp trống cho đến nay
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/a NameError: name 'a' is not defined7. py
import simple_package.a import simple_package.b
Nó sẽ hoạt động ngay bây giờ
def foo[]: print["Hello, function 'foo' from module 'b' calling"]0
ĐẦU RA
Hello, function 'bar' from module 'a' calling Hello, function 'foo' from module 'b' calling
Gói phức tạp hơn
Chúng tôi sẽ chứng minh trong ví dụ sau cách chúng tôi có thể tạo một gói phức tạp hơn. Chúng tôi sẽ sử dụng Modul âm thanh giả định được sử dụng trong hướng dẫn chính thức. [xem https. // tài liệu. con trăn. org/3/hướng dẫn/mô-đun. html]
def foo[]: print["Hello, function 'foo' from module 'b' calling"]2
Chúng tôi sẽ triển khai một hình nộm - chỉ các tệp trống có tên phù hợp - triển khai cấu trúc này. Chúng tôi sẽ cung cấp các biến thể khác nhau của việc triển khai. Để phân biệt giữa các triển khai, chúng tôi sẽ gọi các mô-đun sound1, sound2, sound3 và sound4. Về cơ bản, tất cả chúng nên được gọi là
simple_package/b3. Bạn có thể tải xuống các ví dụ dưới dạng tệp bzip
- /âm thanh/âm thanh1. hắc ín. bz2
- /âm thanh/âm thanh2. hắc ín. bz2
- /âm thanh/âm thanh3. hắc ín. bz2
- /âm thanh/âm thanh4. hắc ín. bz2
- /âm thanh/âm thanh5. hắc ín. bz2
- /âm thanh/âm thanh6. hắc ín. bz2
- /âm thanh/âm thanh7. hắc ín. bz2
Chúng ta sẽ bắt đầu với gói
simple_package/b4. [Bạn có thể giải nén nó bằng
simple_package/b5]
Nếu chúng ta nhập gói
simple_package/b4 bằng cách sử dụng câu lệnh
simple_package/b7, thì gói
simple_package/b4 chứ không phải các gói con
simple_package/b9,
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/b NameError: name 'b' is not defined0 và
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/b NameError: name 'b' is not defined1 sẽ được nhập, như chúng ta sẽ thấy trong ví dụ sau. Lý do cho điều này bao gồm thực tế là tệp
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/b NameError: name 'b' is not defined2 không chứa bất kỳ mã nào để nhập các gói con
def foo[]: print["Hello, function 'foo' from module 'b' calling"]3
ĐẦU RA
def foo[]: print["Hello, function 'foo' from module 'b' calling"]4
Nếu bạn cũng muốn sử dụng các hiệu ứng gói, bạn phải nhập nó một cách rõ ràng với âm thanh nhập. các hiệu ứng
def foo[]: print["Hello, function 'foo' from module 'b' calling"]5
ĐẦU RA
def foo[]: print["Hello, function 'foo' from module 'b' calling"]6
Có thể tự động nhập mô-đun con khi nhập mô-đun
simple_package/b4. Bây giờ chúng tôi sẽ thay đổi thành
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/b NameError: name 'b' is not defined4 để minh họa cách thực hiện việc này. Chúng tôi sử dụng các tệp tương tự như trong
simple_package/b4, nhưng chúng tôi sẽ thêm dòng mã
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/b NameError: name 'b' is not defined6 vào tệp
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/b NameError: name 'b' is not defined2 của thư mục
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/b NameError: name 'b' is not defined4. Các tập tin sẽ trông như thế này bây giờ
def foo[]: print["Hello, function 'foo' from module 'b' calling"]7
Nếu chúng tôi nhập gói
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/b NameError: name 'b' is not defined4 từ trình bao Python tương tác, chúng tôi sẽ thấy rằng gói con
simple_package/b9 cũng sẽ được tải tự động
def foo[]: print["Hello, function 'foo' from module 'b' calling"]8
ĐẦU RA
def foo[]: print["Hello, function 'foo' from module 'b' calling"]9
Thay vì sử dụng một đường dẫn tuyệt đối, chúng ta có thể đã nhập gói hiệu ứng tương ứng với gói âm thanh
import simple_package0
Chúng tôi sẽ chứng minh điều này trong mô-đun
from simple_package import a, b a.bar[] b.foo[]1
import simple_package1
ĐẦU RA
import simple_package2
Cũng có thể tự động nhập các định dạng gói, khi chúng tôi đang nhập gói hiệu ứng. Chúng tôi cũng có thể làm điều này với một đường dẫn tương đối, mà chúng tôi sẽ đưa vào tệp
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/b NameError: name 'b' is not defined2 của thư mục
simple_package/b9
import simple_package3
Nhập
from simple_package import a, b a.bar[] b.foo[]4 cũng sẽ tự động nhập các mô-đun
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/b NameError: name 'b' is not defined1 và
simple_package/b9
nhập âm thanh4
Để kết thúc chương này, chúng tôi muốn trình bày cách nhập mô-đun karaoke từ gói bộ lọc khi chúng tôi nhập gói hiệu ứng. Với mục đích này, chúng tôi thêm dòng từ. bộ lọc nhập karaoke vào tệp
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/b NameError: name 'b' is not defined2 của thư mục hiệu ứng. Các tập tin hoàn chỉnh bây giờ trông như thế này
import simple_package4
Nhập kết quả âm thanh trong đầu ra sau
import simple_package5
ĐẦU RA
import simple_package6
Bây giờ chúng ta có thể truy cập và sử dụng các chức năng của karaoke
import simple_package7
ĐẦU RA
import simple_package8
Đào tạo Python trực tiếp
Thưởng thức trang này?
Thấy. Tổng quan về các khóa học Python trực tiếp
Các khóa học trực tuyến sắp tới
Khái niệm cơ bản về Python cho người mới bắt đầu
Khóa học nâng cao chuyên sâu
Python dành cho kỹ sư và nhà khoa học
Lập trình hướng đối tượng với Python
đăng ký tại đây
Nhập một gói hoàn chỉnh
Đối với chương phụ tiếp theo, chúng tôi sẽ sử dụng lại ví dụ ban đầu từ chương phụ trước của hướng dẫn của chúng tôi. Chúng tôi sẽ thêm một mô-đun [tệp] foobar [tên tệp.
from simple_package import a, b a.bar[] b.foo[]8] vào thư mục âm thanh. Có thể tải xuống lại gói hoàn chỉnh dưới dạng tệp bzip. Bây giờ chúng tôi muốn chứng minh điều gì sẽ xảy ra nếu chúng tôi nhập gói âm thanh có dấu sao, tôi. e.
from simple_package import a, b a.bar[] b.foo[]9. Ai đó có thể muốn nhập theo cách này tất cả các mô hình con và gói con của gói. Hãy xem điều gì sẽ xảy ra
import simple_package9
ĐẦU RA
simple_package/a0
Vì vậy, chúng tôi nhận được thông báo an ủi rằng gói âm thanh đã được nhập. Tuy nhiên, nếu chúng tôi kiểm tra với dir chức năng, chúng tôi thấy rằng cả mô-đun foobar cũng như các hiệu ứng, bộ lọc và định dạng gói con đều chưa được nhập
simple_package/a1
ĐẦU RA
simple_package/a2
Python cung cấp một cơ chế để đưa ra một chỉ mục rõ ràng về các gói con và mô-đun của gói, nên được nhập. Với mục đích này, chúng ta có thể định nghĩa một danh sách có tên là
Hello, function 'bar' from module 'a' calling Hello, function 'foo' from module 'b' calling0. Danh sách này sẽ được lấy làm danh sách các tên mô-đun và gói được nhập khi gặp phải nhập từ gói *
Bây giờ chúng ta sẽ thêm dòng
simple_package/a3
đến
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/a NameError: name 'a' is not defined7. tập tin py của thư mục âm thanh. Bây giờ chúng tôi nhận được một kết quả hoàn toàn khác
simple_package/a4
ĐẦU RA
simple_package/a5
Mặc dù rõ ràng là tất cả các mô-đun đã được nhập, chúng ta có thể kiểm tra lại dir
simple_package/a1
ĐẦU RA
simple_package/a7
Câu hỏi tiếp theo là cái gì sẽ được nhập, nếu chúng ta sử dụng * trong gói con
simple_package/a8
Như mong đợi, các mô-đun bên trong hiệu ứng chưa được nhập tự động. Vì vậy, chúng tôi có thể thêm danh sách
Hello, function 'bar' from module 'a' calling Hello, function 'foo' from module 'b' calling0 sau vào tệp
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/a NameError: name 'a' is not defined7 của các hiệu ứng gói
Chúng ta phải thêm vào tệp
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/b NameError: name 'b' is not defined2 của các thư mục
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/b NameError: name 'b' is not defined0,
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/b NameError: name 'b' is not defined1 và
simple_package/b9 tương ứng các dòng mã sau
Hello, function 'bar' from module 'a' calling Hello, function 'foo' from module 'b' calling8
Hello, function 'bar' from module 'a' calling Hello, function 'foo' from module 'b' calling9
import simple_package.a import simple_package.b0
Bây giờ chúng tôi nhận được kết quả mong muốn
simple_package/a9
ĐẦU RA
simple_package/a5
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/a NameError: name 'a' is not defined1
ĐẦU RA
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/a NameError: name 'a' is not defined2
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/a NameError: name 'a' is not defined3
ĐẦU RA
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/a NameError: name 'a' is not defined4
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/a NameError: name 'a' is not defined5
ĐẦU RA
--------------------------------------------------------------------------- NameError Traceback [most recent call last] in ----> 1 simple_package/a NameError: name 'a' is not defined6
Mặc dù một số mô-đun nhất định được thiết kế để chỉ xuất các tên tuân theo các mẫu nhất định khi bạn sử dụng nhập, nhưng đây vẫn được coi là thông lệ không tốt. Cách được khuyến nghị là nhập các mô-đun cụ thể từ một gói thay vì sử dụng