Python模块介绍(非常详细)

Python模块介绍(非常详细)

0912

Python 模块(Module)包含了 Python 对象定义和 Python 语句。在模块里可以定义函数、类和变量。模块也能包含可执行的代码。把相关的代码分配到一个模块里,可以使代码更好用、更易懂。养成使用模块的习惯,开发者能更有逻辑地组织自己的 Python 代码段。

模块的作用及分类

模块的主要作用是,用来被导入到其他代码模块中。将其他模块导入(import)到当前模块,可以理解成是对当前模块的一种功能增强。不同模块中的函数名和变量是可以相同的。模块的使用,避免了庞大代码量中函数名和变量名冲突的问题。另外,将代码模块化也提高了代码的可维护性与重用性。

Python 中的模块可以分为内置模块、自定义模块和第三方模块三类。

  • 内置模块:Python 中本来就有的模块;
  • 自定义模块:自己开发的模块;
  • 第三方模块:需要单独下载、安装并导入的模块。

模块基本使用方法

模块使用起来非常简单,使用“import 模块名字”(中间有空格)即可将模块导入。下面引入一个内置的time模块,以显示当前时间:

import time  #引入time模块
print(time.time())#获取当前时间,输出:1513299326.049188
print(time.localtime(time.time()).tm_year)#将当前时间格式化,输出:2018

对于内置模块和已经安装好的第三方模块,系统会自动在内置或已经配置好的模块路径下查找该模块,并载入。

模块的搜索路径

自定义模块,还需考虑模块所在的位置,要结合“包名”一起引入。具体语法是:
import 包名.模块名
例如,,想要在 main.py 中导入 work 下面的 train.py 模块,需要如下写法:

import work.train

当导入名为 train 的模块时,解释器会先尝试从内置模块匹配;如果没找到,则将在 sys.path 记录的所有目录中搜索 train.py 文件。变量 sys.path 是一个字符串列表,它为解释器指定了模块的搜索路径。sys.path包括:

  • 当前程序所在目录;
  • 标准库的安装目录(例如:pythom35\\lib\\site-packages);
  • 操作系统环境变量PythonPATH所包含的目录。

在编写代码时,也可以通过列表操作来对sys.path进行读写,例如:

import sys    #引入sys库
print(sys.path)#将sys.path打印出来
sys.path.append('d://lib//Python')#在sys.path里添加一条路径

通过代码对sys.path进行修改,减少了Python程序对环境的依赖,为部署提供了便利。注意:对 sys.path的修改,只在本次程序内有效,系统并不会将sys.path 永久保存。如想永久生效,还需在环境变量里进行配置。

模块的属性

模块除了被引用以外,还会有自己的属性可供调用者查看。其属性大致有如下几种:

  • __name__:名字;
  • __doc__:详细说明,介绍了该模块的使用方法;
  • __package__:所在的包名;
  • __loader__:加载的类名;
  • __spec__:简介,介绍了该模块的名字、加载类名、来源类型等概要信息。

要想查看这些属性的内容,可以通过“导入的模块名 + . + 具体的属性变量”,例如:

import time  #引入time模块
print(time.__name__) #模块名字。输出:time
print(time.__doc__)#详细说明。输出:This module provides various……
print(time.__package__)#包名。因为是内置模块,包名为空,所以输出为空
print(time.__loader__)#加载的类名。输出:<class '_frozen_importlib.BuiltinImporter'>
print(time.__spec__)#简介。输出:ModuleSpec(name='time',…省略部分内容

模块名字的可变性

在 Python 中,模块的名字属性会根据不同的使用场景发生变化。当模块被导入到其他模块时,__name__ 的值为模块本身的名字;而当该模块自己独立运行时,__name__的值会变为“__main__”。示例如下:

1) 新建一个 test1.py 文件,写入如下代码:

print(__name__)#将当前模块的名称打印出来

2) 新建一个 test2.py 文件,写入如下代码:

import test1  #导入test1模块

3) 运行 test1.py 文件,输出如下:

__main__  #输出模块名

4) 运行 test2.py 文件,输出如下:

test1   #输出模块名

可以看到,虽然是同样一段代码,但在第 3 步中是直接运行的,输出了模块名字为“_main__”,而在第 4 步是通过 import 导入运行的,输出的模块名字就变为了“test1”。

模块的常规写法

Python 程序中,每一个代码文件都可以独立运行,当然也可以作为一个模块文件来运行。

我们要养成一个编写模块的好习惯。举个简单的例子,在编写该模块提供的函数或类的时,也可以把自身当作独立运行的文件,为模块本身进行单元测试。这就需要借助模块名字属性的可变特性来实现了。比如可以在模块的最下面加入对模块名字的判断,并执行单元测试代码。如下所示:

if __name__ == '__main__':
    执行单元测试的代码

这样,当直接运行这个模块文件时,可以通过测试代码来检验所定义的函数的输入、输出是否正确。注意,引入模块时,测试代码不会被执行。总之,为模块编写对应的单元测试代码,是一个非常良好的编程习惯。

© 版权声明
THE END
喜欢就支持一下吧
点赞2赞赏
分享
评论 抢沙发
HarryPotter的头像|艾奇编程网

昵称

取消
昵称表情