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 相关文章推荐
在Django的视图中使用数据库查询的方法
Jul 16 Python
PyTorch上实现卷积神经网络CNN的方法
Apr 28 Python
Pandas读取MySQL数据到DataFrame的方法
Jul 25 Python
对numpy中的where方法嵌套使用详解
Oct 31 Python
对python产生随机的二维数组实例详解
Dec 13 Python
Python完成哈夫曼树编码过程及原理详解
Jul 29 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
Aug 06 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
Sep 05 Python
Python代理IP爬虫的新手使用教程
Sep 05 Python
python os.path.isfile()因参数问题判断错误的解决
Nov 29 Python
六种酷炫Python运行进度条效果的实现代码
Jul 17 Python
Python实现敏感词过滤的4种方法
Sep 12 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 字符串 小常识
2009/06/05 PHP
joomla内置的表单验证功能使用方法
2010/06/11 PHP
JavaScript实现删除电脑的关机键
2016/07/26 PHP
jquery动态分页效果堪比时光网
2014/09/25 Javascript
jQuery遍历之next()、nextAll()方法使用实例
2014/11/08 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
Jquery时间轴特效(三种不同类型)
2015/11/02 Javascript
AngularJS向后端ASP.NET API控制器上传文件
2016/02/03 Javascript
jQuery禁用快捷键例如禁用F5刷新 禁用右键菜单等的简单实现
2016/08/31 Javascript
详解如何使用Node.js编写命令工具——以vue-cli为例
2017/06/29 Javascript
js实现水平滚动菜单导航
2017/07/21 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
2017/08/24 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
2018/08/19 Javascript
es6函数之箭头函数用法实例详解
2020/04/25 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
[10:53]2018DOTA2国际邀请赛寻真——EG
2018/08/11 DOTA
python服务器端收发请求的实现代码
2014/09/29 Python
Python3.5编程实现修改IIS WEB.CONFIG的方法示例
2017/08/18 Python
django请求返回不同的类型图片json,xml,html的实例
2018/05/22 Python
Python中filter与lambda的结合使用详解
2019/12/24 Python
Pycharm中切换pytorch的环境和配置的教程详解
2020/03/13 Python
纯CSS3实现手风琴风格菜单具体步骤
2013/05/06 HTML / CSS
美国大尺码女装零售商:TORRID
2016/10/01 全球购物
英国玛莎百货美国官网:Marks & Spencer美国
2018/11/06 全球购物
联想英国官网:Lenovo英国
2019/07/17 全球购物
ORLY官网:美国专业美甲一线品牌
2019/12/11 全球购物
Nobody Denim官网:购买高级女士牛仔裤
2021/03/15 全球购物
C,C++的几个面试题小集
2013/07/13 面试题
解除合同协议书
2014/04/17 职场文书
图书馆志愿者活动总结
2014/06/27 职场文书
2015年度女工工作总结
2015/10/22 职场文书
体育委员竞选稿
2015/11/21 职场文书
vue3使用vue-router的完整步骤记录
2021/06/20 Vue.js
python脚本框架webpy模板控制结构
2021/11/20 Python
基于PyQt5制作一个群发邮件工具
2022/04/08 Python
vue判断按钮是否可以点击
2022/04/09 Vue.js