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代码真的很爽
Aug 26 Python
python聊天程序实例代码分享
Nov 18 Python
python读写ini配置文件方法实例分析
Jun 30 Python
pandas全表查询定位某个值所在行列的方法
Apr 12 Python
Python使用一行代码获取上个月是几月
Aug 30 Python
让Python脚本暂停执行的几种方法(小结)
Jul 11 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
Aug 27 Python
python性能测量工具cProfile使用解析
Sep 26 Python
10行Python代码计算汽车数量的实现方法
Oct 23 Python
python 并发下载器实现方法示例
Nov 22 Python
基于python实现文件加密功能
Jan 06 Python
Django Model中字段(field)的各种选项说明
May 19 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
php对gzip文件或者字符串解压实例参考
2008/07/25 PHP
Symfony2框架创建项目与模板设置实例详解
2016/03/17 PHP
浅谈PHP中的
2016/04/23 PHP
PHP载入图像imagecreatefrom_gif_jpeg_png系列函数用法分析
2016/11/14 PHP
一个基于jquery的文本框记数器
2012/09/19 Javascript
js实现页面转发功能示例代码
2013/08/05 Javascript
jQuery模拟黑客帝国矩阵效果实例
2015/06/28 Javascript
快速学习jQuery插件 jquery.validate.js表单验证插件使用方法
2015/12/01 Javascript
js 获取本地文件及目录的方法(推荐)
2016/11/10 Javascript
基于javascript实现按圆形排列DIV元素(一)
2016/12/02 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
React-router v4 路由配置方法小结
2017/08/08 Javascript
Vue入门之数据绑定(小结)
2018/01/08 Javascript
bootstrap实现点击删除按钮弹出确认框的实例代码
2018/08/16 Javascript
快速解决vue在ios端下点击响应延时的问题
2018/08/27 Javascript
vue.js高德地图实现热点图代码实例
2019/04/18 Javascript
Python中针对函数处理的特殊方法
2014/03/06 Python
python使用百度翻译进行中翻英示例
2014/04/14 Python
python提示No module named images的解决方法
2014/09/29 Python
python安装以及IDE的配置教程
2015/04/29 Python
Python中time模块与datetime模块在使用中的不同之处
2015/11/24 Python
Python 基础之字符串string详解及实例
2017/04/01 Python
Python中单线程、多线程和多进程的效率对比实验实例
2019/05/14 Python
python——全排列数的生成方式
2020/02/26 Python
Python基于jieba, wordcloud库生成中文词云
2020/05/13 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
2020/06/09 Python
英国和世界各地鲜花速递专家:Arena Flowers
2018/02/10 全球购物
英国天然抗衰老护肤品品牌:Nakin Skin Care
2019/04/16 全球购物
新西兰最大的连锁超市:Countdown
2020/06/04 全球购物
夏季奶茶店创业计划书
2014/01/16 职场文书
打架检讨书500字
2014/01/29 职场文书
最新结婚典礼主持词
2014/03/14 职场文书
企业党员公开承诺书
2014/03/26 职场文书
项目建议书范文
2014/05/12 职场文书
餐厅周年庆活动方案
2014/08/25 职场文书
画展观后感
2015/06/17 职场文书