Python 3 包&模块
1. 模块
所谓的模块就是包含python代码的文件,简单来说,后缀是“.py”的文件就是一个模块。(可以作为模块的文件类型有.py、.pyo、.pyc、.pyd、.so、.dll)
对于很多编程语言,都会有程序入口的设计,程序入口也即程序运行的main函数,表示程序运行的开始。但是python作为脚本语言其本质是解释性语言,即python的运行是动态地逐行解释运行的。但是在程序设计过程中,并不想“.py”文件从最顶层代码开始逐行运行,通过模块的设计可以使程序更加地灵活。
1.1 模块的定义
我们在设计时可以将模块分为主模块跟一般模块文件,主模块中负责调用其他模块中的类和方法来组织逻辑,以及程序的运行。
if name == 'main' 的使用:
当.py文件被直接运行时,if name == 'main'之下的代码块将被运行;
当.py文件以模块形式被导入时,if name == 'main'之下的代码块不被运行。
根据模块的规范,最好在模块中编写以下内容:
- 函数(单一的功能实现)
- 类(相似功能的组合,类似业务模块)
- 测试代码
1.2 模块的导入和使用
模块的导入和使用主要有以下几种:
#1. 直接导入
import module_name
module_name.function_name
module_name.class_name
#2. 别名使用
import module_name as new_name
new_name.function_name
new_name.class_name
#后两种模块导入后,直接使用导入内容,不需要添加前缀
#3. 有选择地导入
from module_name import func_name, class_name
#4. 全部导入
from module_name import *
2. 包
包是用来组织模块文件的,一个包中含有若干模块文件(“.py”文件)和一个“init .py”文件 (在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错)
创建包的目的不是为了运行,而是为了导入使用,或者说将相同功能的模块文件组织在一起。
2.1 包的目录结构
|---包
|---|--- __init__.py 包的标志文件
|---|--- 模块1
|---|--- 模块2
|---|--- 子包(子文件夹)
|---|---|--- __init__.py 包的标志文件
|---|---|--- 子包模块1
|---|---|--- 子包模块2
2.2 包的导入和使用
包的导入和使用有以下几种情况:
#1. 直接导入一个包,可以使用init.py中的内容
import package_name
#使用方式:
package_name.func_name
package_name.class_name.func_name()
#2. 为包添加别名
import package_name as p
#在使用上同1类似,需要添加前缀
#3. 导入包中某一个具体的模块
import package.module
#使用方式:
package.module.func_name
package.module.class.fun()
package.module.class.var #引用类中的变量
#4. 导入包中的模块并添加别名
import package.module as pm
#5. from … import 导入,此种导入方法不执行__init__的内容
from package import module1, module2, module3, …
from package import *
from package.module import *
Tips:
需要注意的是from后import导入的模块,必须是明确的一个不能带点,否则会有语法错误,如:from a import b.c是错误语法。(应写为from a.b import c)
绝对导入和相对导入
绝对导入是从package_name.开始进行文件的导入
而相对导入是由“.”或“..”开始,主要为了满足在一个包内的相互引用的需求(只能在一个包中使用,不能跨到其他包的目录下)
#例如,想在package01/sub1/a.py中导入package01/sub2/b.py #绝对导入: from package01.sub2 import b #相对导入: from ..sub2 import b
2.3 init.py文件
一个目录下如果包含 init.py ,则被 Python 视作一个 Python package。
通常__init__.py 文件为空,但是我们还可以为它增加其他的功能。我们在导入一个包时,实际上是导入了它的__init__.py文件。这样我们可以在__init__.py文件中批量导入我们所需要的模块,而不再需要一个一个的导入。
# package01
# __init__.py
import os
import re
import urllib
import sys
import os
# a.py
import package01
#package01中的__init__.py已经导入了需要的外部模块,因此在a模块中可以省略
print(package.re, package.urllib, package.sys, package.os)
注意这里访问__init__.py文件中的引用文件,需要加上包名。
参考链接: