__init__.py文件

1.

img

创建一个结构如上图的文件夹:

  • test文件夹里包含A文件夹、B文件夹和测试文件test.py
    • A文件夹下包含A_A文件夹
      • A_A文件夹下面包含testa_a.py文件,里面有funca_a函数可以打印消息
    • A文件夹下有testa.py和testa2.py文件,分别有函数funca和funca2,可以打印消息
    • B文件夹下有testb.py文件,有函数funcb,可以打印消息
1
2
3
4
5
6
7
8
9
10
#test.py
from A import testa
from B import testb
testa.funca()
testb.funcb()
'''
out:
this is funca
this is funcb
'''

2.

在大部分情况下,使用A里面的函数,不会去一条一条的from…impot,而是

1
2
3
4
5
6
from A import *
testa.funca()
'''
out:
NameError: name 'testa' is not defined
'''

然而,不能直接对A进行上述操作,此时A还不是一个package,我没需要添加__init__.py函数

3.创建__init__.py

在A文件下创建文件__init__.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#__init__.py
from A import testa
from A import testa2
from A.A_A import testa_a
print("导入完成!")
#test.py
from A import *
testa.funca()
testa2.funca2()
testa_a.funca_a()
#out
'''
导入完成!
this is funca
this is funca2
this is funca_a
'''
  • 使用__init__.py函数后,可以看到A已经变成一个可以使用的package
  • 通过out的输出,可以知道在__init__.py函数里面可以进行一些初始化的操作,比如打印信息print("导入完成!")print("导入完成!")

此时也可以直接

1
2
3
4
import A
A.testa.funca()
A.testa2.funca2()
A.testa_a.funca_a()

结果是一样的

4.__all__参数

在__init__.py里面一行行的from…impor…似乎也没方便多少,可以使用__all__来快速导入需要的.py文件

1
2
3
4
5
6
7
8
9
10
11
12
13
#__init__.py
__all__ = ["testa","testa2"]
print("导入完成!")
#test.py
from A import *
testa.funca()
testa2.funca2()
#out
'''
导入完成!
this is funca
this is funca2
'''
  • __all__是一个列表参数,里面元素是不带后缀的文件名字符串
  • 不能使用import A
1
2
3
4
5
6
7
8
#test.py
import A
A.testa.funca()
A.testa2.funca2()
#out
'''
AttributeError: module 'A' has no attribute 'testa'
'''