Python3 模块和包
1. 模块(module)
1.1 模块介绍
逻辑上来说模块就是一组功能的组合,在Python可理解为对应于一个.py
文件。
使用模块最大的好处是大大提高了代码的可维护性。
首先,编写代码不必从零开始。当一个模块编写完毕,就可以被其它地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。
其次,使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。
我们使用的模块主要可分为三种:
- 标准模块
- 第三方模块
- 自定义模块
1.2 模块使用
模块搜索路径:
- 第一优先级为当前执行脚本的目录
- 第二优先级为PYTHONPATH
- 第三优先级为安装位置
可以通过import
对模块进行导入,同时为了方便也可以给模块起别名,如下,
import module
import module as md
当需要导入多个模块时,有以下两种方法,
import module1, module2
import moduel1
import module2
当我们只需要使用模块的某些功能时,可以使用from ... import
,
from module import fun1
注意from ... import
同样支持as
起别名,以及导入多个功能,方法同上。
2. 包(package)
上面介绍了模块,我们也许会想到不同人写的模块的名字也可能相同,发生冲突,为了解决这个问题。Python引入了按目录来组织模块的方法,称为包(Package)。包的本质上是一个文件夹,包含了很多代码文件。
注意:所有包文件夹下都必须包含一个__init__.py
的文件,这样做的目的是告诉Python这个文件夹是一个包。__init__.py
可以是空文件,也可以包含代码,可以使用多层文件夹组成多层次的包。
3. 从包中导入模块
考虑下面一个文件夹层次结构,
parent_directory/
main.py
ecommerce/
__init__.py
database.py
products.py
payments/
__init__.py
paypal.py
authorizenet.py
3.1 绝对导入
要先给出这个模块、函数的完整路径,如在main.py
需要访问produces模块中的Product类,使用使用如下的三种方法进行绝对导入:
import ecommerce.products
product = ecommerce.products.Product()
from ecommerce.products import Product
product = Product()
from ecommerce import products
product = products.Product()
import语句使用点号作为分隔符来分隔包或者模块。
3.2 相对导入
在包(package)的情况下,如果知道父模块的名称,那么就可以使用相对导入。比如当前在products模块下工作,想从隔壁的database模块导入Database类,就可以使用相对导入:
from .database import Database
这里点号表示当前路径的database模块。
如果我们正在编辑ecommerce.payments包里的paypal模块,需要引用父包里的database模块的Database类:
from ..database import Database
这里两个点号表示访问上层路径的模块。
如果ecommerce有contact包,该包里有email模块,需要将该模块的sendEmail函数导入到paypal模块中:
from ..contact.email import sendEmail
3.3 直接从包导入变量
在ecommerce包里有两个模块,一个是database.py
,另一个是products.py
,假设database里面有一个db变量,这个变量在很多地方都会被访问,那么我们下面的代码将可以实现用import ecommerce.db取代import ecommerce.database.db。
在ecommerce/__init__.py
文件里加入:
from .database import db
那么我们就可以用下面的语句,在mian.py或者其他文件访问这个db属性了:
from ecommerce import db