Python基础-模块(module)和包(package)
1.模块
出现原因:开发过程中程序代码越来越多,如果直接放在一个文件爱你,代码会越来越长,造成代码不易维护。
为了编写方便,维护代码,可以把不同功能的代码保存在不同的文件里。这样,每个文件包含的代码量就会比较少,方便维护
定义:
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。
模块让你能够有逻辑地组织你的 Python 代码段。在Python中,一个.py文件就可以称之为一个模块
即:
- 包含相应功能的函数以及变量,py则以.py为扩展名
- 模块可以为其他程序引用,以使用该模块所对应的函数或者变量
- 使用模块的优点:
- 提高代码的可维护性
- 提高代码的复用性
- 可以导入很多功能的模块
- 标准库模块
- 第三方模块
- 自定义模块
- 避免变量名重复(作用域)
Python中导入模块的常用方式
- import 模块名称
import module[,module1[,module2]]
#调用其中函数时使用 module.funcation的形式
- import 模块名称 as 新名称
import module as name
- from 模块名称 import 函数名
from module import funcation
#from module import * 为引入module的全部内容
区别:
-
import 模块名称和 import 模块名称 as 新名称
- 会导入整个模块
- 如果需要使用某个函数名,必须以‘模块名称.函数名()’来使用(这种方法跟有利于程序代码可读性(优先推荐))
-
import 模块名称 as 新名称 ,重新命名导入模块 通常使模块名称简洁,方便使用
-
from 模块名称 import 函数名
- 只导入某一函数,而不是一整个模块
- 可以直接通过函数名称去调用,无需在函数名称前加模块名称
- 调用很多模块,可能会有名称冲突(不推荐使用)
2.包
定义:
-
包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。简单来说,包就是文件夹,但该文件夹下必须存在 __init__ 文件, 该文件的内容可以为空。__init__.py 用于标识当前文件夹是一个包。。
-
目的:
- 将文件/模块通过文件夹组织起来
- 不是为了运行,而是为了导入使用,其本质仍是模块
- 可以更加便捷的对代码进行功能管理
-
注意:
- Python3,即使包中没有_init_.py也可以使用,而Py2会报错
- 用import导入带点的,点的最左边一定是一个包名
- import导入时,其名称空间的名字源于文件,导入包的本质是导入_init_.py文件
一个例子
demo:
下面是一个包的结构图
➜ school tree
.
├── api
│ ├── __init__.py
│ ├── students.py
│ └── versions.py
├── cmd
│ ├── __init__.py
│ └── manage.py
├── db
│ ├── __init__.py
│ └── models.py
└── __init__.py
import school
school.api.students.get() #报错 import school并未导入school下的子模块中
#1.在school下的__init__.py添加
from . import api #在当前目录下导入api模块
#2.然后在 api下的__init__.py 添加
from . import students #在api模块导入students模块
#3.然后再执行
import school
school.api.students.get()
#小结:在school包下的__init__.py内导入包的子包
#同时在子包的__init__导入子包的子模块
#就可以在导入school模块时同时导入相关的子模块
- from … import 时 import后的模块,必须是一个不包含’.‘的,否则报错
在school/api/versions.py中导入school/cmd/manage.py
在 school/api/versions.py
from school.cmd import manage #绝对导入
manage.main()
from ..(当前目录上一层)cmd import manage #相对导入
__all__的用法
公开声明了暴露接口:
格式:
__all__(a,b,c...,n) #可以为模块或者函数
#在__init__中只要有__all__(),那么调用与之匹配的模块时,只能使用在__all__中的函数或者模块