模块与包

  • 模块对应于Python源文件代码;
  • 多个功能相似的模块可以组织成一个包。
    • Python中的模块包括系统模块、第三方模块和用户自定义模块。它们实质上是以.py为扩展名的Python文件
    • 通过导入模块,可以使用该模块中的变量、函数和类等。

一,模块化程序设计思想

(1)概念

  • 如果程序中包含多个可以复用的函数或类,则通常把相关的函数和类分组包含在单独的模块(module)中。这些提供计算功能的模块称之为模块(或函数模块),导入并使用这些模块的程序,则称之为客户端程序。
  • 把计算任务分离成不同模块的程序设计方法,称之为模块化编程。使用模块,可以将计算任务分解为大小合理的子任务,并实现代码的重用功能。

(2)模块API(ApplicationProgrammingInterface)

  • 客户端使用模块提供的函数时,无须了解其实现细节;
  • 模块和客户端之间遵循的契约称之为API(Application Programming Interface,应用程序编程接口);
  • API用于描述模块中提供的函数的功能和调用方法。
  • 模块化程序设计的基本原则是先设计API(即模块提供的函数或类的功能描述),然后实现API(即编写程序,实现模块函数或类),最后在客户端中导入并使用这些函数或类;
    • 通过内置函数help(),可以查看Python模块的API;
    • 通过Python在线帮助查看math模块的API:执行IDLE菜单命令(Help|Python Docs)。
      以math函数为例:
>>>import math
>>>help(math)      #因为内容太多就不展示运行结果

(3)API设计

  • API定义客户端和实现之间的契约。API是一个明确的规范,规定“实现的具体功能是什么;
  • API通常由两部分组成:可用函数的签名的精确规范,以及描述函数作用的非正式自然语言描述。API一般使用表格的形式,描述模块中的变量、函数和类;
  • 当编写一个新模块时,建议先设计API,然后实现模块。

(4)模块设计的一般原则

  • (1)先设计API,再实现模块;
  • (2)控制模块的规模,只为客户端提供需要的函数。实现包含大量函数的模块会导致模块的复杂性。例如,Python的math模块中就不包含正割函数、余割函数和余切函数,因为这些函数很容易通过函数math.sin()、math.cos()和math.tan()的计算而得;
  • (3)在模块中编写测试代码,并消除全局代码;
  • (4)使用私有函数实现不被外部客户端调用的模块函数;
  • (5)通过文档提供模块帮助信息。

(5)模块的实现的概念

  • “实现”是指实现用于重用的函数或类的代码,模块的实现就是若干实现函数或类的代码的集合,保存在一个后缀为.py的文件中;
  • 模块的实现必须遵循API规约,可以采用不同算法实现API,这为模块的改进和版本升级提供了无缝对接,只需要使用遵循API的新的实现,所有客户端程序无须修改即可以正常运行。

(6)模块的客户端

  • 客户端遵循API提供的调用接口,导入和调用模块中实现的函数功能;
  • API允许任何客户端直接使用模块,而无需检测模块中定义的代码,例如可以直接使用模块math和random等。

(7)模块化程序设计的优越性

  • 可以编写大规模的系统程序
  • 控制程序的复杂度
  • 实现代码重用
  • 增强可维护性

二,模块的导入与创建

(1)模块导入方式(import)

(2)创建模块

  • Python模块对应于包含Python代码的源文件(其扩展名为.py),在文件中可以定义变量、函数和类;
  • 在模块中,除了可以定义变量、函数和类之外,还可以包含一般的语句,称之为主块(全局语句)。当运行该模块,或导入该模块时,主块语句将依次执行。

三,模块的搜索路径

(1)模块的搜索路径

模块搜索路径即Python搜索模块时的路径,这些路径存储于sys模块中的sys.path属性中,用户可以先在解释器中导入sys模块再查看sys.path的值,示例如下:

>>>import sys
>>>sys.path
['',
 'C:\\Users\\sjg\\Anaconda3\\python36.zip',
 'C:\\Users\\sjg\\Anaconda3\\DLLs',
 'C:\\Users\\sjg\\Anaconda3\\lib',
 'C:\\Users\\sjg\\Anaconda3',
 'C:\\Users\\sjg\\Anaconda3\\lib\\site-packages',
 'C:\\Users\\sjg\\Anaconda3\\lib\\site-packages\\Babel-2.5.0-py3.6.egg',
 'C:\\Users\\sjg\\Anaconda3\\lib\\site-packages\\win32',
 'C:\\Users\\sjg\\Anaconda3\\lib\\site-packages\\win32\\lib',
 'C:\\Users\\sjg\\Anaconda3\\lib\\site-packages\\Pythonwin',
 'C:\\Users\\sjg\\Anaconda3\\lib\\site-packages\\IPython\\extensions',
 'C:\\Users\\sjg\\.ipython']

(2)模块的导入顺序

导入模块时,解释器按下列目录搜索路径和文件搜索顺序查找并导入文件。目录搜索路径为:

  • (1)当前目录。启动交互式Python的目录,或Python主程序位于的目录。
  • (2)操作系统环境变量PYTHONPATH中指定的目录。
  • (3)Python标准库目录

(3)模块搜索路径sys.path

  • sys模块的sys.path返回一个列表
  • 使用import语句导入模块时,系统自动从该列表的路径中搜索模块,如果找不到,则程序报错。
  • 临时增加模块搜索路径方法:
>>>import sys
>>>sys.path.append(路径)

四,模块的属性

"–all–'与“–name–”

(1)“–all–”属性

使用方法:–all-- = [‘func’ ]
“–all–” 变量控制模块里哪些功能可以使用*导入

(2)“–name–”属性

通过特殊变量__name__可以获取模块的名称

(3)模块的测试代码

• 每个模块都有一个名称,通过特殊变量__name__可以获取模块的名称
• 特别地,当一个模块被用户单独运行时,其__name__的值为’main’。故可以把模块源代码文件的测试代码写在相应的测试判断中,以保证只有单独运行时,才会运行测试代码

五,包及模块的打包发布

➢包是Python引入的分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。
➢每一个Python的包目录下面都会有名为__init__.py的特殊文件,该文件可以为空文件,但是必须存在,它表明这个目录不是普通的目录结构,而是一个包,里面包含模块。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值