一、包、模块
Python中的包相当于文件夹,模块就是.py文件
不同包下有相同名称的模块时,为了区分,可在模块里加上“包名.模块名”路径,这个路径叫做命名空间
注:如果想让一个普通的文件夹变为包,则需要在这个文件夹内添加__init__.py文件,init前后各两个下划线,此文件的路径不是包名.文件名,而是包名
二、导入其它模块的变量
包设置如下图
p5文件夹下新增c1.py
a = 2
b = 3
c = 4
p4文件夹下新增c2.py
1)import 路径.模块名
c2.py
import p4.c1
print(T.C1.a)
2)import 命名空间.模块名 as 标识名
import p4.c1 as c
print(c.a)
引入其它模块运行后,会由python解释器自动生成一个__pycache__文件夹,里面包含引入的模块名.cpython-36.pyc文件
3) 引入变量
注:import只能引入模块,不能直接引入模块下的变量,可以使用“from 命名空间.模块名 import 变量名”来引入变量
A.只引入需要的变量
c2.py
from p5.c1 import a
from p5.c1 import b
print(a)
print(b)
B.引入全部变量
from p5.c1 import *
print(a)
print(b)
print(c)
C.使用from 命名空间 import 模块名,将模块看作一个变量来引入
c2.py
D.在c1.py中加入内置变量__all__,定义只可导入的变量
c1.py
__all__ = ['a', 'b']
a = 2
b = 3
c = 4
c2.py
from p5.c1 import *
print(a)
print(b)
print(c)
此时import *,只能导入__all__里含有的变量a和b,不能导入c,因此运行会报错
print(c)
NameError: name 'c' is not defined
注:使用内置变量后,只是使用“from ... import *”时,只能导入内置变量的元素,未被归入内置变量的元素,仍可单独导入成功,即
c2.py
from p5.c1 import *
from p5.c1 import c
print(a)
print(b)
print(c)
此时会运行成功,打印
2
3
4
三、vscode的小技巧
3.1隐藏__pycache__文件夹,在用户设置中搜file.exclude,加入"**/__pycache__":true,即可隐藏该文件夹
3.2换行
注:python中建议一行最多有80个字符
3.2.1 可以在一行的末尾加入“\”
3.2.2 将需要换行的内容用()括起来
3.3将可执行文件作为一个普通模块来执行,可以使用命令: python -m 命名空间.模块
不使用-m时,python后面加的是物理路径
四、__init__.py文件
4.1 一个文件夹下有__init__.py文件时,这个文件夹就会变为包,如果没有此文件就是一个普通的文件夹
4.2 当一个包被导入时,__init__.py文件会被自动执行
在p5下添加__init__.py文件,并加入一行打印信息代码,运行c2.py
注:一般在__init__.py文件添加初始化信息
4.3 可以在文件中添加内置变量,规定哪些模块可以被引出
在p5文件夹下添加c3.py文件
__init__.py中,添加内置变量,规定只可对c1导出
c2.py文件中,导入c3,并执行
注:__init__.py中的内置变量同样只对 “from...import *”起作用,单独导入未归入内置变量的模块是可以执行的
4.4 可以在包的__init__中批量导入库、模块,将需要引入这些库、模块的.py中添加一行导入这个包的代码,就可以了
示例,p4下新建一个c4.py,c2与c4都需要导入相同的库,可以将这些库添加在__init__.py中
c4.py中可以不重复导入,直接打印sys的信息
注:1.包和模块不会重复导入
2.要避免循环导入,如c1与c3互相导入,形成了一个循环,运行c2.py,会报错
五、内置变量
注:模块中除了人为定义的一些变量外,还有一些其它变量是已经被定义好的
c3.py中打印dir()信息,dir()可以输出所有的变量信息
打印出的带有双下划线的变量是系统定义好的内置变量
5.1__name__:模块的命名空间+模块名
注:当__name__的值为__main__时,此文件为入口文件
可以在模块中加入以下代码,代表当前文件为入口文件执行时,可以运行的代码
if __name__ == '__main__'
pass
5.2__package__:模块的包名
注:入口文件不属于任何包,所以入口文件的__package__没有值,为nonetype
5.3__doc__:模块中的注释
5.4__file__:模块的物理路径,即在电脑中的存储路径
注:__file__的值与执行全集python的路径有关
六、相对导入和绝对导入
6.1 顶级包:可执行文件所在的包,是其引入的其它模块的顶级包
6.2 绝对路径:从顶级包开始往下查找
6.3 相对路径:单独使用import不能使用相对路径,只能用于“from... import 模块”的格式
“.”:表示当前目录
“..”:表示上一级目录
“...”:表示上上级目录
依次类推
注:1.执行文件不能使用相对路径,因为相对路径能找到模块是根据内置变量__name__去定位,而执行文件的__name__值会变为__main__,此时无法定位
2.相对路径不能导入与顶级包同级或超出顶级包的模块,若要执行,则需要在执行文件的上一级包执行