Có một số quan niệm sai lầm quan trọng cần được giải quyết, cụ thể với thuật ngữ. Đầu tiên, thông thường, khi bạn nghĩ rằng bạn đang nhập package
vào trăn, những gì bạn đang thực sự nhập là module
. Bạn nên sử dụng thuật ngữ package
khi bạn đang suy nghĩ về cấu trúc con của hệ thống tệp giúp bạn tổ chức mã của mình. Nhưng từ góc độ mã, bất cứ khi nào bạn nhập package
, Python coi nó là một mô-đun. Tất cả các gói là các mô-đun. Không phải tất cả các mô-đun đều là các gói. Một mô-đun có thuộc tính __path__
được coi là một gói.
Bạn có thể kiểm tra xem os
là một mô-đun hay không. Để khẳng định điều này bạn có thể làm:
import os
print(type(os)) # will print: <type 'module'>
Trong ví dụ của bạn, khi bạn làm import FooPackage
, FooPackage
được xử lý và được coi là một mô-đun quá, và thuộc tính của nó (chức năng, các lớp học, vv) được cho là quy định tại __init__.py
. Vì __init__.py
của bạn trống nên không thể tìm thấy foo
.
Ngoài các câu hỏi import
bạn không thể sử dụng ký hiệu '.'
để giải quyết các mô-đun bên trong mô-đun. Ngoại lệ duy nhất xảy ra nếu một số module
được nhập vào gói __init__.py
của phụ huynh dự định. Để làm cho nó rõ ràng, chúng ta hãy làm một số ví dụ ở đây:
Xem xét cấu trúc ban đầu của bạn:
FooPackage/
__init__.py
foo.py
Trường hợp 1: __init__.py là tệp rỗng
#FooPackage imported as a module
import FooPackage
#foo is not a name defined in `__init__.py`. Error
FooPackage.foo
#FooPackage.foo imported as a module
import FooPackage.foo
#Error, foo has not been imported. To be able to use foo like this,
#you need to do: import FooPackage.foo as foo
foo.anything
#Not error, if anything is defined inside foo.py
FooPackage.foo.anything
Trường hợp 2: __init__.py có dòng import foo
trong đó:
import FooPackage
#Now this is good. `foo` is sort of considered to be an attribute of
#FooPackage
FooPackage.foo
Bây giờ, giả sử rằng foo không còn là module
, nhưng là function
mà bạn xác định trong __init__.py
. nếu bạn làm import FooPackage.foo
, nó sẽ ném một lỗi nói rằng foo
không phải là một mô-đun.
Như tôi đã hiểu, câu hỏi không phải là cách nhập mô-đun con - đó là lý do tại sao bạn có thể truy cập một mô-đun con của hệ điều hành mà không cần nhập mô-đun con đó và cách triển khai một cái gì đó tương tự. Chỉnh sửa: Tuy nhiên, câu trả lời của bạn sẽ làm việc – pycoder112358