模块
1、定义:模块:用来从逻辑上组织python代码(变量、函数、类、逻辑:实现一个功能),本质上是.py结尾的python文件(文件名;test.py ,对应的模块名:test)。
2、模块导入方法:
import module_name
import module_name,module2_name
from module_alex import* #建议不用
from module_name import m1,m2,m3
from module_name import m1 as a1
3、import 本质(路径搜索和搜索路径)
导入模块的本质就是把python文件解释一遍
导入包的本质就是解释(执行)该包下的__init__.py 文件
4、导入优化(任何Python程序都可以作为模块导入)
from module_name import m1,m2
5.模块分类
a.标准库
b.开源模块,第三方模块
c.自定义模块
6.模块搜素路径
7.导入循环(交叉引用)与import原理
导入循环:两个模块互相导入
import原理:将导入的模块执行一遍
在python开发过程中,应尽量避免导入循环(交叉引用),但是,如果你开发了大型的 Python 工程, 那么你很可能会陷入这样的境地。
解决方法:
将 import 语句移到函数的内部,只有在执行到这个模块时,才会导入相关模块。
错误示范
b.py
import os import a def get_size(file_path): if a.file_exists(file_path): file_size=os.path.getsize(file_path) print('the file %s size is[%s]' %(file_path,file_size))
a.py
import os import b def file_exists(file_path): return os.path.isfile(file_path) def download(file_path): b.get_size(file_path) print('download file %s' %file_path) def upload(file_path): print('upload file %s' %file_path) download('a.txt')
解决方法:修改b.py
import os def get_size(file_path): import a if a.file_exists(file_path): file_size=os.path.getsize(file_path) print('the file %s size is[%s]' %(file_path,file_size))
a.py不变
包(package)
包:用来从逻辑上组织模块的:本质上是一个目录(必须带有一个__init__.py 文件)
通常包总是一个目录,可以使用import导入包,或者from + import来导入包中的部分模块。包目录下为首的一个文件便是 __init__.py。然后是一些模块文件和子目录,假如子目录中也有 __init__.py 那么它就是这个包的子包了。
在创建许许多多模块后,我们可能希望将某些功能相近的文件组织在同一文件夹下,这里就需要运用包的概念了。包对应于文件夹,使用包的方式跟模块也类似,唯一需要注意的是,当文件夹当作包使用时,文件夹需要包含__init__.py文件,主要是为了避免将文件夹名当作普通的字符串。__init__.py的内容可以为空,一般用来进行包的某些初始化工作或者设置__all__值,__all__是在from package-name import *这语句使用的,全部导出定义过的模块。
可以从包中导入单独的模块。
__init__.py
文件。常见的包结构如下:
package_a ├── __init__.py ├── module_a1.py └── module_a2.py package_b ├── __init__.py ├── module_b1.py └── module_b2.py main.py
- 如果
main.py
想要引用packagea
中的模块module
a1
,可以使用:
from package_a import module_a1 import package_a.module_a1
- 如果
package_a
中的module_
a1
需要引用package_b
,那么默认情况下,python是找不到package_
b
。我们可以使用sys.path.append('../')
,可以在packagea
中的__init__.py
添加这句话,然后该包下得所有module都添加*import __init
_
即可。 - 如果package_a中的module_a1需要引用package_b下的module_b1:
-
#在module_a1里
import os,sys #dirname返回目录名不要文件名 print(__file__)#相对路径 print(os.path.abspath(__file__))#绝对路径+相对路径 print(os.path.dirname(os.path.abspath(__file__)))#上一级 print(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))#上两级 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(BASE_DIR)#把路径添加到python的搜索路径集 from package_b import moduel_b 1