Python 3 包&模块

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文件中的引用文件,需要加上包名。

参考链接:

python3:高级-包管理(包、模块、命名空间)

点赞