Python中模块(Module)和包(Package)的区别详解


Posted in Python onAugust 07, 2019

1. 模块(Module)

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

使用模块有什么好处?

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

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

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

举个例子,一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块。
现在,假设我们的abc和xyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名,比如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
 └─ xyz.py

文件www.py的模块名就是mycompany.web.www

Notes: 自己创建模块时要注意命名,不能和Python自带的模块名称冲突。例如,系统自带了sys模块,自己的模块就不可命名为sys.py,否则将无法导入系统自带的sys模块。

2. 使用模块

Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用。

我们以内建的sys模块为例,编写一个hello的模块:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
#!/usr/bin/env python3 
# -*- coding: utf-8 -*-

' a test module '

__author__ = 'Michael Liao'

import sys

def test():
  args = sys.argv  # argv参数用列表存储命令行的所有参数
  if len(args)==1: # 当列表长度为1时即只有一个参数时
    print('Hello, world!')
  elif len(args)==2: # 当命令行有两个参数时
    print('Hello, %s!' % args[1])
  else:
    print('Too many arguments!')

if __name__=='__main__':
  test()

第1行和第2行是标准注释,第1行注释可以让这个hello.py文件直接在Unix/Linux/Mac上运行,第2行注释表示.py文件本身使用标准UTF-8编码;

第4行是一个字符串,表示模块的文档注释,任何模块代码的第一个字符串都被视为模块的文档注释;

第6行使用__author__变量把作者写进去,这样当你公开源代码后别人就可以瞻仰你的大名;

以上就是Python模块的标准文件模板,当然也可以全部删掉不写,但是,按标准办事肯定没错。

后面开始就是真正的代码部分。

你可能注意到了,使用sys模块的第一步,就是导入该模块:

import sys

导入sys模块后,我们就有了变量sys指向该模块,利用sys这个变量,就可以访问sys模块的所有功能。

sys模块有一个argv变量,用list存储了命令行的所有参数。argv至少有一个元素,因为第一个参数永远是该.py文件的名称,例如:

运行python3 hello.py获得的sys.argv就是['hello.py'],注意这里python3不算是参数;

运行python3 hello.py Michael获得的sys.argv就是['hello.py', 'Michael]。

最后,注意到这两行代码:

if __name__=='__main__':
  test()

当我们在命令行运行hello模块文件时,Python解释器把一个特殊变量__name__置为__main__,而如果在其他地方导入该hello模块时,if判断将失败,因此,这种if测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试。

我们可以用命令行运行hello.py看看效果:

$ python3 hello.py
Hello, world!
$ python hello.py Michael
Hello, Michael!

如果启动Python交互环境,再导入hello模块:

>>> import hello
>>>

导入时,没有打印Hello, word!,因为没有执行test()函数。

调用hello.test()时,才能打印出Hello, word!:

>>> hello.test()
Hello, world!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python自动安装pip
Apr 24 Python
深入学习python的yield和generator
Mar 10 Python
Python简单获取自身外网IP的方法
Sep 18 Python
python之PyMongo使用总结
May 26 Python
Python生成一个迭代器的实操方法
Jun 18 Python
django认证系统实现自定义权限管理的方法
Aug 28 Python
django数据模型on_delete, db_constraint的使用详解
Dec 24 Python
Python脚本导出为exe程序的方法
Mar 25 Python
pyMySQL SQL语句传参问题,单个参数或多个参数说明
Jun 06 Python
python实现学生成绩测评系统
Jun 22 Python
Python 如何测试文件是否存在
Jul 31 Python
Python简易开发之制作计算器
Apr 28 Python
python的常见矩阵运算(小结)
Aug 07 #Python
python字典的setdefault的巧妙用法
Aug 07 #Python
解决Django中调用keras的模型出现的问题
Aug 07 #Python
python 字典 setdefault()和get()方法比较详解
Aug 07 #Python
与Django结合利用模型对上传图片预测的实例详解
Aug 07 #Python
如何用Python来搭建一个简单的推荐系统
Aug 07 #Python
PIL对上传到Django的图片进行处理并保存的实例
Aug 07 #Python
You might like
蝙蝠侠:侠影之谜
2020/03/04 欧美动漫
PHP实现图片旋转效果实例代码
2014/10/01 PHP
php PDO实现的事务回滚示例
2017/03/23 PHP
php往mysql中批量插入数据实例教程
2018/12/12 PHP
javascript引用对象的方法代码
2007/08/13 Javascript
jQuery实现动画效果的实例代码
2013/05/07 Javascript
JavaScript中的Reflect对象详解(ES6新特性)
2016/07/22 Javascript
详解Node.js如何开发命令行工具
2016/08/14 Javascript
JS小数转换为整数的方法分析
2017/01/07 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
jQuery插件DataTables分页开发心得体会
2017/08/22 jQuery
JS动态添加的div点击跳转到另一页面实现代码
2017/09/30 Javascript
js判断输入框不能为空格或null值的实现方法
2018/03/02 Javascript
vue 使用eventBus实现同级组件的通讯
2018/03/02 Javascript
vue 组件内获取actions的response方式
2019/11/08 Javascript
原生js实现表格翻页和跳转
2020/09/29 Javascript
js实现简单商品筛选功能
2021/02/02 Javascript
Python基于回溯法子集树模板解决全排列问题示例
2017/09/07 Python
python实现二叉树的遍历
2017/12/11 Python
python实现requests发送/上传多个文件的示例
2018/06/04 Python
解决PyCharm import torch包失败的问题
2018/10/13 Python
python去重,一个由dict组成的list的去重示例
2019/01/21 Python
新手如何发布Python项目开源包过程详解
2019/07/11 Python
浅谈Django+Gunicorn+Nginx部署之路
2019/09/11 Python
python ctypes库2_指定参数类型和返回类型详解
2019/11/19 Python
Python类继承和多态原理解析
2020/02/05 Python
Python API len函数操作过程解析
2020/03/05 Python
Python常用外部指令执行代码实例
2020/11/05 Python
碧欧泉法国官网:Biotherm法国
2019/10/23 全球购物
大学生标准推荐信范文
2013/11/25 职场文书
2013年研究生毕业感言
2014/02/06 职场文书
纪检干部学习心得体会
2016/01/23 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书
python3读取文件指定行的三种方法
2021/05/24 Python
雄兵连:第三季先行图公开,天使恶魔联合,银河之力的新力量
2021/06/11 国漫
Spring IOC容器Bean的作用域及生命周期实例
2022/05/30 Java/Android