包(package):在Python中不止有模块,还有另外一个概念,叫做包,包是作为文件夹存在的,文件夹中必须存在__init__.py文件,包可以包含模块,也可以包含其它包。
graphics/ __init__.py primitive/ __init__.py line.py fill.py text.py formats/ __init__.py png.py jpg.py
__init__.py文件的作用:
1)__init__.py 是 Python 中包的标识。普通的文件夹是不能通过 import 被其它模块使用的,但是创建了 __init__.py 文件后,该文件夹就
成为一个 package,它下面的所有模块都能被导入。
2)相当于 class 中的 def __init__(self) 函数,可以在里面放置代码来初始化包。如果第一次执行下面语句:
import graphics
则文件 graphics/__init__.py 将被导入, 因为.py文件是一个模块,所以 __init__.py 的导入流程就是模块的导入,可阅读博客:python模块。
所以会建立 graphics 命名空间的内容。
如果执行下面的语句:
import graphics.format.jpg
文件 graphics/__init__.py 和文件 graphics/formats/__init__.py 将在文件 graphics/formats/jpg.py 导入之前导入。
绝大部分时候让 __init__.py 空着就好。但是有些情况下可能包含代码。举个例子,__init__.py 能够用来自动加载子模块:
# graphics/formats/__init__.py from . import jpg from . import png
像这样一个文件, 用户可以仅仅通过 import grahpics.formats 来代替 import graph-ics.formats.jpg 以及 import graphics.formats.png。
3)当使用 from module import * 语句时,希望对从模块或包导出的符号进行精确控制。在__init__中定义一个变量 __all__ 来明确地列出需要导出的模块和包。
如果 __all__ 存在于普通模块中,那就是用来限定需要导出的函数和变量。