04 包与模块之二


目录

  1. python中的组织结构:包、模块、类
  2. 关于模块与变量的导入
  3. __init__.py的作用
  4. 包与模块的几个常见错误
  5. 模块的内置变量
  6. 入口文件和普通模块在内置变量的区别
  7. __name__的经典应用
  8. 相对导入、绝对导入

三、__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

声明:Jerry's Blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 04 包与模块之二


Follow excellence, and success will chase you.