你只会得到你导入的东西。因此,在你的主目录中,你只会得到DirA 和DirB。您可以通过以下方式之一使用它们:
import DirA
DirA.something_in_init_py()
# Importing hello:
import DirA.hello
DirA.hello.something_in_hello_py()
# Using a named import:
from DirA.hello import something_in_hello_py
something_in_hello_py()
在DirB 中,只需将__init__.py 也设为空即可。 __all__ 的唯一用途是当您想要导入 * 时,这是您不想要的,因为正如他们所说,显式优于隐式。
但如果你好奇,它会这样工作:
from DirB import *
something_in_dirb()
默认情况下,import * 将导入它可以找到的不以下划线开头的所有内容。指定__all__ 会将其导入的内容限制为__all__ 中定义的名称。见this question for more details。
编辑:关于初始化。
__init__.py 并没有真正连接到导入的东西。它只是一个具有以下属性的特殊文件:
- 它的存在意味着该目录是一个python包,里面有几个模块。如果不存在,python 将拒绝从该目录导入任何内容。
- 它总是在加载目录中的任何其他内容之前加载。
- 其内容将作为包本身提供。
试试把这个放到DirA/__init__.py:
foo = 42
现在,在你的主要:
from DirA import foo
print(foo) # 42
它很有用,因为您可以在__init__.py 中导入一些子模块来隐藏包的内部结构。假设您构建了一个包含 Author、Book 和 Review 类的应用程序。为了使其更易于阅读,您在包中为每个类提供了自己的文件。现在在您的主目录中,您必须导入完整路径:
from myapp.author import Author
from myapp.book import Book
from myapp.review import Review
显然不是最优的。现在假设您将上面这些确切的行放在您的__init__.py 中,您可以像这样简化您的主要内容:
from myapp import Author, Book, Review
Python 将加载__init__.py,这将依次加载所有子模块并导入类,使它们在包中可用。现在你的 main 不需要知道类的实际实现位置。