导入包的时候会被隐式执行__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.py
def add(a, b):
return a + b
## @file sub.py
def sub(a, b):
return a - b
## @file mul.py
def mul(a, b):
return a * b
## @file dev.py
def dev(a, b):
return a / b
整理前:
## @file main.py
## import 了好多包
import arithmetic.add
import arithmetic.sub as sub
from arithmetic.mul import mul
from arithmetic import dev
def letscook(x, y, oper):
r = 0
if 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, 8
letscook(x, y, "+")
letscook(x, y, "-")
letscook(x, y, "*")
letscook(x, y, "/")
整理后:
## @file main.py
import arithmetic as a4
def letscook(x, y, oper):
r = 0
if 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, 8
letscook(x, y, "+")
letscook(x, y, "-")
letscook(x, y, "*")
letscook(x, y, "/")
## @file __init__.py
import arithmetic.add
import arithmetic.sub
import arithmetic.mul
import arithmetic.dev
add = arithmetic.add.add
sub = arithmetic.sub.sub
mul = arithmetic.mul.mul
dev = arithmetic.dev.dev
在模糊导入时,形如from package import *,*是由__all__定义的。
__all__是一个重要的变量,用来指定此包(package)被import *时,哪些模块(module)会被import进【当前作用域中】。
不在__all__列表中的模块不会被其他程序引用。
可以重写__all__,如__all__= ['当前所属包模块1名字', '模块1名字'],如果写了这个,则会按列表中的模块名进行导入
## a.py
def add(x, y):
return x + y
def subtract(x, y):
return x - y
## __init__.py
from .a import add, subtract
__all__ = ['add']
表示add方法包含了,subtract方法没有包含