你只得到你进口的东西。因此,在main中,只得到DirA和{}。你可以用以下方法之一使用它们: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__的唯一用途是用于当您想导入*时使用的,因为正如他们所说,显式优于隐式。在
但如果你好奇的话,它是这样工作的:
^{pr2}$
默认情况下,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中放上这些精确的行,你可以这样简化你的main:from myapp import Author, Book, Review
Python将加载__init__.py,它将依次加载所有子模块并导入类,使它们在包中可用。现在,main不需要知道类在哪里实际实现。在