一、模块的概念

在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。

为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)。

使用模块有什么好处?

最大的好处是大大提高了代码的可维护性。

其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。

所以,模块一共三种:

  • python标准库
  • 第三方模块
  • 应用程序自定义模块

另外,使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。

二、模块的导入

1. import 语句

1
import module1[, module2[,... moduleN]

当我们使用import语句的时候,Python解释器是怎样找到对应的文件的呢?答案就是解释器有自己的搜索路径,存在sys.path里。  

1
2
['', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu',
'/usr/lib/python3.4/lib-dynload', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']  

因此若像我一样在当前目录下存在与要引入模块同名的文件,就会把要引入的模块屏蔽掉。

2. from…import 语句

1
from modname import name1[, name2[, ... nameN]]

这个声明不会把整个modulename模块导入到当前的命名空间中,只会将它里面的name1或name2单个引入到执行这个声明的模块的全局符号表。

3. from…import* 语句

1
from modname import *

这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。大多数情况, Python程序员不使用这种方法,因为引入的其它来源的命名,很可能覆盖了已有的定义。

三、包

如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。

举个例子,一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块。

现在,假设我们的abcxyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名,比如mycompany,按照如下目录存放:

mycompany
├─ __init__.py
├─ abc.py
└─ xyz.py

引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,abc.py模块的名字就变成了mycompany.abc,类似的,xyz.py的模块名变成了mycompany.xyz

请注意,每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是mycompany

类似的,可以有多级目录,组成多级层次的包结构。比如如下的目录结构:

mycompany
├─ web
│ ├─ __init__.py
│ ├─ utils.py
│ └─ www.py
├─ __init__.py
├─ abc.py
└─ utils.py

最新文章

  1. ime-mode
  2. 第五百八十五天 how can I 坚持
  3. 2014 ACM/ICPC 北京邀请赛 部分 题解
  4. MYSQL数据导入导出
  5. mouseout以及mouseover
  6. 转: android编译过程(流程图)
  7. 使用Class.getResource和ClassLoader.getResource方法获取文件路径
  8. 浅谈C51内存优化
  9. C#内存操作
  10. CentOS7安装Zabbix
  11. 学习笔记——命令模式Command
  12. Elastic 技术栈之 Filebeat
  13. zabbix入门知识
  14. c# 根据唯一码,存缓存 实现12小时内 阅读量+1
  15. Kubernetes — 深入解析Pod对象:基本概念(一)
  16. python中类似三元表达式的写法
  17. layui获取子集表单中的值,关闭父级弹窗
  18. SQL Server 索引自动组织维护
  19. 一名前端Web架构师的成长之路(转载)
  20. eclipse配置maven后无法下载jar

热门文章

  1. 洛谷 P4779 【模板】单源最短路径(标准版) 题解
  2. 过拟合产生的原因(Root of Overfitting)
  3. 微信小程序HTTP封装请求
  4. Android Studio一直显示Building“project name”Gradle project info问题详解
  5. select count(1)和 select count(*)
  6. avalon $computed不起作用?
  7. 【2019.12.11】SDN上机第7次作业
  8. 软件工程第二次作业——Java学习路线
  9. [C++] 对象指针使用方法
  10. 第12组 Beta冲刺(5/5)