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解析nginx日志文件
May 11 Python
python写日志封装类实例
Jun 28 Python
Python实现telnet服务器的方法
Jul 10 Python
Python中使用OpenCV库来进行简单的气象学遥感影像计算
Feb 19 Python
详解python中的json和字典dict
Jun 22 Python
Python中print和return的作用及区别解析
May 05 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
May 13 Python
Python进度条的制作代码实例
Aug 31 Python
为什么说python更适合树莓派编程
Jul 20 Python
vscode调试django项目的方法
Aug 06 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
Oct 15 Python
详解Django中的FBV和CBV对比分析
Mar 01 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
如何分别全角和半角以避免乱码
2006/10/09 PHP
php使用正则表达式进行字符串搜索的方法
2015/03/23 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
10个值得深思的PHP面试题
2016/11/14 PHP
编写兼容IE和FireFox的脚本
2009/05/18 Javascript
js压缩工具 yuicompressor 使用教程
2010/03/31 Javascript
JS+CSS实现一个气泡提示框
2013/08/18 Javascript
js检验密码强度(低中高)附图
2014/06/05 Javascript
jQuery实现自定义事件的方法
2015/04/17 Javascript
原生js实现模拟滚动条
2015/06/15 Javascript
Three.js如何用轨迹球插件(trackball)增加对模型的交互功能详解
2017/09/25 Javascript
微信小程序 循环及嵌套循环的使用总结
2017/09/26 Javascript
Vue 自定义指令功能完整实例
2019/09/17 Javascript
vant IndexBar实现的城市列表的示例代码
2019/11/20 Javascript
React实现类似淘宝tab居中切换效果的示例代码
2020/06/02 Javascript
Javascript实现单选框效果
2020/12/09 Javascript
梳理一下vue中的生命周期
2020/12/30 Vue.js
[50:20]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第四局
2016/03/06 DOTA
python装饰器-限制函数调用次数的方法(10s调用一次)
2018/04/21 Python
利用Python如何制作好玩的GIF动图详解
2018/07/11 Python
对Python的多进程锁的使用方法详解
2019/02/18 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
2019/06/12 Python
Python语法垃圾回收机制原理解析
2020/03/25 Python
django models里数据表插入数据id自增操作
2020/07/15 Python
详解Python中string模块除去Str还剩下什么
2020/11/30 Python
阿里健康大药房:阿里自营网上药店
2017/08/01 全球购物
美国孕妇装购物网站:Motherhood Maternity
2019/09/22 全球购物
SNIDEL官网:日本VIVI杂志人气少女第一品牌
2020/03/12 全球购物
Weblogic的布署方式
2013/08/23 面试题
学期自我鉴定
2013/11/04 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
锦旗赠语
2015/06/23 职场文书
幼儿园亲子活动感想
2015/08/07 职场文书
新年祝酒词大全
2015/08/11 职场文书
安全责任协议书范本
2016/03/23 职场文书
Python捕获、播放和保存摄像头视频并提高视频清晰度和对比度
2022/04/14 Python