模块和包
模块
一个模块就是一个包含python代码的文件。一个文件就是一个模块
为什么要使用模块?
1.现在程序开发文件比较大,都放在一个文件中维护不方便,拆分成多个文件方便维护与管理
2.模块可以增加代码的重用率
3.模块可以当作命名空间
如何定义自己的模块
模块本身就是一个文件,所有py代码都可以在文件中直接书写。不过我们开发共用模块时,最好在模块中书写以下内容。
变量(模块中的属性值)
函数(单独的功能)
类(相似功能组合)
模块测试代码(临时使用,被导入时不会执行)
测试代码:
测试代码经常在开发模块时用于测试模块的功能,但是测试代码仅在开发和测试时使用,被当作模块导入时不希望测试代码运行。需要使用name特殊变量来操作。
if __name__ == '__main__':
测试代码区域(仅在吧当前文件直接运行时才会执行测试代码,当作模块导入时则不会执行)
__name__ 在直接运行当前文件时,结果为__main__
__name__ 被当作模块导入文件时,结果为 模块名称
模块的导入方式
import 模块 直接导入模块
使用方法:
模块名.变量名
模块名.函数名
模块名.类名.方法名()
模块名.类名.属性名
import 模块 as 别名 直接导入模块,并且为模块起一个别名‘
使用方法:
别名.变量名
别名.函数名
别名.类名.方法名()
别名.类名.属性名
from 模块 import 某个函数或者类 直接导入模块中的某个方法或者某个类或变量
使用方法:
函数名()
变量名
类名.方法名()
属性名
from 模块 import 函数,函数,类,类... 直接导入模块中的多个方法和多个类和变量
使用方法:
函数名()
变量名
类名.方法名()
属性名
from 模块 import * 直接导入模块中的所有方法和类和变量
使用方法:
函数名()
变量名
类名.方法名()
属性名
注意事项:如果采用from 导入的方式要确保模块中的函数变量等内容不能与系统的内置函数同名,否则会出现异常。
模块的存放
如果不想自己新建自定义的模块文件夹,可以将我们自定义的模块存放到 python目录中的\Lib\site-packages中。
搜索路径就是python在加载模块时候的查找路径
1.获取当前模块的搜索路径
import sys
sys.path 获取当前搜索路径的列表
2.将自定义的路径添加到列表中
sys.path.append(自定义路径)
模块的加载顺序
导入模块操作的步骤:
1.检测内存中是否已经加载过当前模块,如果加载过,直接使用加载的模块
2.如果内存中没有加载当前模块,则搜索python的内置模块
3.如果当前内置模块中中没有该模块,根据搜索路径查找并且加载模块
包
包就是文件夹,他用于存放文件也就是模块。包中也可以存放包
包的结构
包
|---- __init__.py 包的标志文件
|---- 模块1
|---- 模块2
|---- 子包(文件夹)
|-----|----__init__.py
|---- |----子模块1
|---- |----子模块2
包的导入和使用
import 包.模块
使用方法:
包.模块.变量名
包.模块.函数名()
包.模块.类名.属性名
包.模块.类名.方法名()
import 包.模块 as 别名
使用方法:
别名.变量名
别名.函数名()
别名.类名.属性名
别名.类名.方法名()
from 包.模块 import 函数或者类或者属性
使用方法:
变量名
函数名()
类名.属性名
类名.方法名()
from 包.模块 import *
使用方法:
变量名
函数名()
类名.属性名
类名.方法名()
在init.py文件中添加内容(当模块用)
在此情况下可以将包当作模块直接导入使用
import 包
使用:
包.变量名
包.函数名()
包.类名.属性名
包.类名.方法名()
import 包 as 别名
使用:
别名.变量名
别名.函数名()
别名.类名.属性名
别名.类名.方法名()
from 包 import 函数,类,变量
使用:
变量名
函数名()
类名.属性名
类名.方法名()
from 包 import *
使用:
变量名
函数名()
类名.属性名
类名.方法名()
包和模块的互相调用问题
如果在当前模块中需要调用其他模块或者包的内容时,可以直接使用import 导入对应的包和模块,就可以加载进来使用,import 会搜索包和模块对应的搜索路径(sys.path)
import 模块或者包
all特殊变量的用法
1.在init.py文件中,如果没有all变量,那么使用from 包 import * 仅导入init.py中定义的方法和类及其他内容
2.在init.py文件中,如果定义all变量,那么使用from 包 import * 则会导入all指定的所有模块,而忽略init.py文件中的信息
__all__ = ['模块','模块','子包'。。。] 必须是列表