什么是模块?
模块(moduls):python中的每一个文件都可以称之为模块.文件中封装这一些功能相似的类,函数,变量等等.可以被其他的文件反复调用的文件叫做模块.
什么是包?
包(package):python中包就是包含着大量模块的文件夹,并且包中有一个"__init__.py"的文件,声明这个文件夹是一个python pakcage.可以将大量功能相关的python模块包含起来统一管理,同样也可以被其他模块通过import关键字引入重复使用封装的模块和代码!
包和模块的复用
import 和from ... import ...
1.import 方法
- 引入模块
基础语法:
import 模块名
使用模块的数据时直接可以模块.数据名 即可
模块.变量
模块.函数
模块.类型
- 引入包
基础语法
import 包名.模块名
ps:因为包中包含多种模块,所以在引入是要指定引入的包中模块名
使用时可以直接如上方式
包名.模块名.变量
包名.模块名.函数
包名.模块名.类型
注:import 方式引入模块和包是会自动从当前文件夹中,系统环境变量PYTHONPATH中,以及系统的sys.path路径中查询是否存在该名称的模块/包
如果不存在,则会报错:no mudels named 'xxxx'
2.from ... import ...
from . import 模块名 #从当前路径下引入一个模块
from .. import 模块名 #从当前文件夹的父级文件引入模块
form 模块名 import 变量,类型,函数 #从模块中引入变量,类型,函数
from 包名 import 模块名 #从一个包中引入包中模块
from 包名.模块名 import 类型,函数,变量 #从一个包中模块引入模块中的类型,函数,变量
from ... import ... 主要是针对于包的引入方法,首先要明确包中的组织结构才能正确使用from import 语法
通过上述可以看出from import 分为两种操作
- 使用./..的相对路径的引入操作方式
- 直接使用包/模块名的绝对引入操作方式
相对引用:相对信用是相对于当前才做的文件的路径
同一级路径使用符号: .
上一级路径使用: ..
但是需要注意的是,一旦使用相对路径,就要明确所谓相对路径~是依赖他们所属的父级文件夹确定的
所以在使用相对引用时,引入的路径相对当前文件;执行的路径相对于引入的最外层文件夹,这样才能正确的使用相对引入操作执行我们的模块代码
例如:在demo文件夹下,有两个py文件,main.py和test.py.其中main.py中使用相对引用,引用了test中的数据(from . import test),此时,当我们在命令行中执行运行代码命令时需要"python -m demo.main"
如果直接python main.py 去运行时,会出现个 "ImportError:cannot import name ‘test’"
绝对引用:直接从包/模块的源头引用,运行方式和前面的一样
在说模块和包
python中的模块,指代的就是一个Python文件;模块名称就是文件名称
- 在一个python模块中可以包含的数据有:变量、函数、类型等等,是一个完整的独立的代码块!
- 独立的一个模块中的变量:全局变量、局部变量;能被其他模块引入使用的只有当前模块中的全局变量,其他模块对于当前模块中全局变量的操作和普通变量一致!
- 模块一旦被其他模块引入,就会自动执行模块中的所有代码
- 模块中的测试代码可以包含在 if __name__ == “__main__”: 语句块中,这样不会再其他模块引入时执行这些测试代码
包:
python解释器在执行处理代码时,会默认将包含Python文件的文件夹处理成默认包
默认包只具备文件路径关联的功能,无其他功能!
python中的标准包,是在文件夹中包含包声明文件__init__.py的文件夹,主要包含了一个名称为__init__.py的模块文件,该文件夹就是一个Python模块包
在一个python的包中,可以创建多个模块,统一由python包进行路径管理和导入方式的管理
包中的__all__:
默认情况下,包中所有的模块都是可以直接导入的,同样为了使用方便,可以通过通配符的方式来一次引入包中所有指定的模块
__all__属性就是用于模糊导入的特殊魔法属性,值是一个包含模块名称的列表,主要声明在__init__.py文件中,用于定义可以使用通配符的方式引入的模块