python-模块和包
模块:
1. 一个py文件,就是一个模块,文件中包括定义的函数和类等信息。
2. 尽管可以import多次,实际上模块只导入一次
3. 模块搜索路径 内存中已经加载的模块->内置模块->sys.path路径(导模块的环境变量)中包含的模块
4. 导入模块
将整个模块导入 import 模块名
导入所有函数 from 模块名 import *
从模块中导入某个函数 from 模块名称 import 函数1(, 函数2...) 也可以是属性
使用区别
import 模块名和form 模块名 import *,调用模块函数(属性)时的格式是 模块.函数属性)
from 模块名 import 函数名(属性名),这可以直接使用,无需添加模块名
包:
假设目录结构如图:
1. 当一个目录内含有__init__ . py文件时,就可以视该目录为一个包,因此图中Model和 Basenodel logmodel都是包
2. 导入包
(1)import 包名; import Model.Basemodel, importModel, import Basemodel;使用该模块下的方法时,需要将import之后名称全部加上,方可调用成功。
该操作只能导入该包下的模块,不能导入子包中的模块;也不能通过通过包名.报名.模块.函数(变量)来访问。
直接导入Model,Model中包含包
![]()
提示属性不存在,将Basemodel当作模块调用
![]()
(2)from 包名.[包名. ] import 模块名(模块名字之前不能有'包名.'): from Model.Basemodel import Image
(3)from 包名.[包名. ] import *
3. __init__文件
(1) 该文件,可以表示该目录是一个包,内容可以为空,第一次导入包或者是包的任何其他部分,实际就是导入该文件。因此,我们在该文件中导入需要的模块(别人在导入包的同时,也就导入__init__文件中的模块),这样在使用时,用户感觉可以将这个包当作模块使用,而不关心其背部结构。
例如:Model包中的__init__文件内容如下:
其他模块在导入时,就可以简单的使用,不用关心其内部结构(使得导入包 向导入模块一样简单)
![]()
(2) 特殊变量 __all__
__init__不仅仅用来导入模块,其本身也可以加入代码,其中存在特殊变量__all__ ,该变量是一个列表,列表中以字符串的格式存放变量或者函数,在执行 form 包 import * 时,导入该列表内容。示例:
列表中添加了add函数和xx变量
其他模块执行 from Model import *,
![]()
执行结果:
提示mul函数未定义,因为该函数不在__all__列表中
4.相对路径导入
在此目录结构中,__init__ 和 Basemodel 在同一目录下,因此在__init__文件中想要导入BaseModel文件,可以使用相对路径,也就是使用linux系统中的 .(本目录) 和..(上级目录),并且只能在一个目录中使用,不能用于不同目录内
此截图,使用的就是'.',意思是同级目录下的Basemodel包,而不会去寻找其他包。