目的:控制包的导入行为
简单来说:python程序运行时,__init__.py文件会将当前目录(文件夹)激活为module(模块包),其他模块引用此package模块时会自动加载运行该__init__.py文件,便于开发人员在__init__.py中做一些初始化操作。
目录中的__init__.py文件作用:将当前整个文件夹当作一个包来管理,每当有外部import的时候,就会自动执行里面的函数。
(1)标识该目录是一个python的模块包
(2)简化模块导入操作
(3)功能的封装和细节隐藏
对于第2点详细说明,假定现在项目结构如下:
package1
-> __init__.py
-> model1.py
-> model2.py
-> model3.py
package2
-> utils.py
run.py
那么,如果程序需要在多个py文件多次使用到package1时,这时可以直接在package1.__init__.py中提前导入需要的各个py模块,也可以对相关功能函数起别名提供统一访问函数,实际使用时只需导入package1即可,避免了频繁的导入package1中的各个模块。
可以被import语句导入的对象是以下类型:
- 模块文件(.py文件)
- C或C++扩展(已编译为共享库或DLL文件)
- 包(包含多个模块)
- 内建模块(使用C编写并已链接到Python解释器中)
在导入模块时,解释器做以下工作:
- 以导入模块的名称创建新的命名空间,通过该命名空间可以访问导入模块的属性和方法。
- 在[新创建的命名空间]中执行源代码文件。
- 创建一个名为源代码文件的对象,该对象引用模块的名字空间,这样就可以通过这个对象访问模块中的函数及变量
可以在程序中使用import多次导入同一个模块,但模块代码仅在该模块首次导入时执行,后面import语句只是简单的创建一个到模块名字空间的引用而已
import直接导入和from import导入的区别:
使用from语句可以把[模块]直接导入[当前命名空间],from语句并不引用导入[对象的命名空间],而是将[被导入对象]直接引入[当前命名空间]。
此外,在__init__.py定义__all__变量,用以限定需要导入的的属性、方法、类。
-- over --