
导入包的时候会被隐式执行__init__.py 是一个特殊的 Python 文件,用于将一个目录标记为 Python 的包。
| 用法 | 作用 |
|---|---|
当一个目录中包含 __init__.py 文件时 |
Python 解释器会将其视为一个包,允许你使用 import 语句导入包内的模块。 |
| 这个文件可以为空 | 也可以定义包的初始化代码,例如初始化数据、设置包级别的变量或定义包的命名空间。 |
定义 __all__ __init__.py 文件允许你控制包的导入行为 |
列表来指定当使用 from package import * 时应该导入哪些模块。 |
__init__.py 文件还可以用来执行包级别的初始化操作 |
比如注册钩子函数、设置日志配置等。 |
随着 Python 3.3 的发布,引入了隐式命名空间包(INP),这种类型的包不需要 __init__.py 文件,但 __init__.py 仍然有其用途,特别是在需要执行包初始化代码或明确定义包结构时。
可以没有作用
|--arithmetic ---python包|--|--__init__.py ---导入|--|--add.py|--|--sub.py|--|--mul.py|--|--dev.py
## @file add.pydef add(a, b):return a + b
## @file sub.pydef sub(a, b):return a - b
## @file mul.pydef mul(a, b):return a * b
## @file dev.pydef dev(a, b):return a / b
整理前:
## @file main.py## import 了好多包import arithmetic.addimport arithmetic.sub as subfrom arithmetic.mul import mulfrom arithmetic import devdef letscook(x, y, oper):r = 0if oper == "+":r = arithmetic.add.add(x, y)elif oper == "-":r = sub.sub(x, y)elif oper == "*":r = mul(x, y)else:r = dev.dev(x, y)print("{} {} {} = {}".format(x, oper, y, r))x, y = 3, 8letscook(x, y, "+")letscook(x, y, "-")letscook(x, y, "*")letscook(x, y, "/")
整理后:
## @file main.pyimport arithmetic as a4def letscook(x, y, oper):r = 0if oper == "+":r = a4.add(x, y)elif oper == "-":r = a4.sub(x, y)elif oper == "*":r = a4.mul(x, y)else:r = a4.dev(x, y)print("{} {} {} = {}".format(x, oper, y, r))x, y = 3, 8letscook(x, y, "+")letscook(x, y, "-")letscook(x, y, "*")letscook(x, y, "/")
## @file __init__.pyimport arithmetic.addimport arithmetic.subimport arithmetic.mulimport arithmetic.devadd = arithmetic.add.addsub = arithmetic.sub.submul = arithmetic.mul.muldev = arithmetic.dev.dev
在模糊导入时,形如from package import *,*是由__all__定义的。__all__是一个重要的变量,用来指定此包(package)被import *时,哪些模块(module)会被import进【当前作用域中】。不在__all__列表中的模块不会被其他程序引用。可以重写__all__,如__all__= ['当前所属包模块1名字', '模块1名字'],如果写了这个,则会按列表中的模块名进行导入
## a.pydef add(x, y):return x + ydef subtract(x, y):return x - y
## __init__.pyfrom .a import add, subtract__all__ = ['add']
表示add方法包含了,subtract方法没有包含