一. 包与模块的名字
1.module
通常,模块就是一个文件,模块名即为文件名。
2.package
包物理意义上来说是一个文件夹,包名就是该文件夹的名称。包目录下为首的一个文件便是 __init__.py;如果不存在这个文件,那么它就只是一个单纯的文件夹,而不是包。包中存放一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。
二.import导入模块
目录
- 采用 import module 的方式导入
import sub_package.p2
print(sub_package.p2.a)
- 采用 from module import parameter/module/* 的方式导入
from sub_package import p2
print(p2.a)
print(p2.b)
from sub_package.p2 import a, b
print(a)
print(b)
from sub_package.p2 import *
print(a)
print(b)
但是不推荐*来导入,这样导入的不是很明确,可能会导入发生错误
在导入模块时,程序会默认执行该模块
在使用*导入时,可以在被导入的模块开始定义 __all__属性来限制可以导入的变量,如下
__all__ = ['a', 'b']
a = 2
b = 1
c = 3
三.__init__.py的用法
__init__.py也是一个模块文件,但是不同于普通的模块文件,它的__name__是它的包名。
在导入包时,会自行的运行该包下的__init__.py文件。
举例:
在包下的__init__.py中加入一行print输出
print('this is a file whose name is __init__')
在p1模块中import p2模块,然后执行p1
p1模块
import sub_package.p2
print(sub_package.p2.a)
控制台
所以我们可以在__init__.py中做一些初始化
四.模块内置变量
可以同 dir() 函数来获取模块的所有变量
print(dir())
控制台输出
含有首位下划线的变量就是模块的内置变量
- 当模块作为导入的模块时
__doc__ : 该模块的注释
__file__ : 模块的路径名(Win下的完整路径名)
__name__ : 模块的文件名(包含顶级包名(与程序入口的同级包)的完整文件名)
__package__ : (包含顶级包名的完整包名)
- 当模块作为程序入口时
__doc__ : 该模块的注释
__file__ : 与执行该模块的位置有关,就是从执行的位置开始,到该文件名结束。
__name__ : __main__
__package__ : 无,程序入口不属于任何包
五. __name__的经典应用
__name__通常用来判断该模块是作为程序入口还是导入的模块,以此作出不同的行为
六. 相对导入和绝对导入
- 相对导入(即 import .module_name)
程序入口不支持相对导入,原因就在于程序入口是不属于任何包的,也就不存在 . 回到上一级包的操作
- 绝对导入(即以顶级包的路径名开始的完整路径名导入)