目录
- python中的组织结构:包、模块、类
- 关于模块与变量的导入
- __init__.py的作用
- 包与模块的几个常见错误
- 模块的内置变量
- 入口文件和普通模块在内置变量的区别
- __name__的经典应用
- 相对导入、绝对导入
三、__init__.py的作用
该模块是自己手动建立的,做一些包和模块的初始化工作
1.导入包时,会首先自动运行里面的代码
(1)自动运行
seven/t/__init__.py
a = 'This is __init__.py file'
print(a)
seven/c11.py
import t #导入的这个包t,包含__init__.py文件
-->python c11.py
This is __init__.py file
seven/t/__init__.py
a = 'This is __init__.py file'
print(a)
seven/t/c7.py
a = 2
b = 3
c = 4
seven/c11.py
import t.c7 import a #只导入了包t下的c7.py文件,没有导入__init__.py文件
-->
This is __init__.py file #但也自动打印出了__init__.py中代码
无论是导入一个包,还是包下面某一模块的变量,python会自动运行 __init__.py文件。
(2)首先运行
seven/t/__init__.py
#只能导出c7.py
__all__ = ['c7'] #内置变量__all__不仅可以决定哪个变量被导出,还可以决定哪个模块被导出
seven/t/c7.py
a = 2
b = 3
c = 4
seven/t/c8.py
d = 5
e = 6
f = 7
seven/c11.py
import t import *
print(c7.a)
print(c8.e)
-->
2
c8未定义
2.可批量导入
seven/t/t12.py
import sys
import datatime
import io #内置的标准库,即类库 #本质与自己定义的一样
print(sys.path)
-->
[...]
如果c13.py、c14.py都要引入上述类库,那都要重复一一的写出吗?
当然不是。
seven/t/__init__.py #直接在__init__文件中导入一次即可
import sys
import datatime
import io
seven/t/t12.py
import t #其他模块要想使用这些类库,直接导入包即可
print(t.sys.path)
seven/t/t13.py
import t #其他模块要想使用这些类库,直接导入包即可
print(t.sys.path)
-->python c12.py
[...]
-->python c13.py
[...]
四、包与模块的几个常见错误
1.导入包和模块时,里面的代码只执行一次
例如,__init__.py 被多个模块导入使用,但 __init__.py 里面的代码只运行一次。
被导入的其他普通模块,也是只执行一次。
否则,导入多少次,就代码执行多少次,太伤性能!
2.模块之间不能循环导入
t/p2.py
from p1 import a1
a2 = 2
t/p1.py
from p2 import a2 #模块p1中的a2变量是从p2模块拿来的。但你p2之前还拿过我p1的东西。不行
a1 = 1
print(a2)
-->python p1.py
error❌
不只是两个模块之间不能循环导入,多个(>=3)模块之间也不能循环导入:
3.当导入某模块时,就会执行该模块下的代码
这里的“模块”,严谨点,是指除了__init__.py 模块之外的其他任意模块
因为__init__.py就算不导入,它也会自动运行
t/p2.py
a2 = 2
print(a2)
t/p1.py
import p2
-->python p1.py
2 #p1中没有打印语句,之所以打印出2,是因为执行了被导入的p2中的print
Comments | NOTHING