1、模块(module)
逻辑上来说模块就是一组功能的组合;实质上一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。
import加载的模块分为四个通用类别:
a.使用python编写的代码(.py文件);
b.已被编译为共享库或DLL的C或C++扩展;
c.包好一组模块的包
d.使用C编写并链接到python解释器的内置模块;
2、模块的使用
模块的使用通过关键字import和from进行导入。模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行。
#我们先自定义一个模块 名为mod.py;
print("hello world")
def func1():
print("python")
def func2():
print("hello")
#然后我们使用里一个py文件进行导入这个模块;
import mod
import mod
import mod
>>>
#只打印了一次
hello world
第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载大内存中的模块对象增加了一次引用,不会重新执行模块内的语句.
3、模块的导入方式
以上述mod.py文件为例
-
直接导入,再使用该模块的函数时
import mod
mod.func1()
运行结果
hello world
python
-
导入模块特定部分
from mod import func1
func1()
运行结果
hello world
python
-
导入模块起别名
import mod as m
m.func1()
运行结果
hello world
python
-
模块成员全部导入(不推荐使用)
from mod import *
func1()
func2()
运行结果
hello world
python
hello
-
一次导入多个模块
import mod
import mod1
import mod2
或者直接用“,”分隔
import mod,mod1,mod2
2、包(package)
包是有层次的文件目录结构,内部有多个模块或多个子包,一般有__init__.py初始化的这个文件(3.3+ 的版本不需要)。
假设有下面的层次文件目录结构:
parent_directory/
main.py
ecommerce/
__init__.py
database.py
products.py
payments/
__init__.py
paypal.py
authorizenet.py
其中ecommerce为包,payments为子包,模块databases中有Database类,products中有Product类。
- 绝对导入Product类并实例化
以在主函数main.py导入包和模块为例
#main.py
import ecommerce.products
product = ecommerce.products.Product()
#或者from...import导入
from ecommerce.products import Product
product = Product()
#或
from ecommerce import products
product = products.Product()
- 相对导入
在包(package)的情况下,如果知道父模块的名称,那么就可以使用相对导入。比如当前在products模块下工作,想从隔壁的database模块导入Database类,就可以使用相对导入:
#econommerce下的products.py
# 点号表示使用当前路径的database模块
from .database import Database
如果我们正在编辑ecommerce.payments包里的paypal模块,需要引用父包里的database模块:
#paypal.py
# 使用两个点号表示访问上层的父类
from ..database import Database