浅谈Python中的模块


Posted in Python onJune 10, 2020

模块

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

使用模块有什么好处?

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

模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中。但是也要注意,尽量不要与内置函数名字冲突。

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

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

浅谈Python中的模块

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

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

使用模块

!/usr/bin/env python3
# -*- coding: utf-8 -*-
' a test module '
__author__ = 'Michael Liao'
import sys
def test():
 args = sys.argv
 if len(args)==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 hello.py Michael获得的sys.argv就是['hello.py', 'Michael]。

工具脚本就是通过sys.argv读取使用参数

最后,注意到这两行代码

if __name__=='__main__':
 test()

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

比如:

如果直接命令行使用python3 hello.py,__name____main__,满足if,执行test()
如果从test.py导入使用hello.py模块,__name__就为test,不满足if,也就不会执行test()

作用域

在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用。在Python中,是通过_前缀来实现的。
正常的函数和变量名是公开的(public),可以被直接引用,比如:abc,x123,PI等;

类似__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的__author__,__name__就是特殊变量,hello模块定义的文档注释也可以用特殊变量__doc__访问,我们自己的变量一般不要用这种变量名;

类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等;

之所以我们说,private函数和变量“不应该”被直接引用,而不是“不能”被直接引用,是因为Python并没有一种方法可以完全限制访问private函数或变量,但是,从编程习惯上不应该引用private函数或变量。

换句话说,仅仅是声明而已,要访问还是能访问的,private函数或变量不应该被别人引用,那它们有什么用呢?

ef _private_1(name):
 return 'Hello, %s' % name
def _private_2(name):
 return 'Hi, %s' % name
def greeting(name):
 if len(name) > 3:
 return _private_1(name)
 else:
 return _private_2(name)

我们在模块里公开greeting()函数,而把内部逻辑用private函数隐藏起来了,这样,调用greeting()函数不用关心内部的private函数细节,这也是一种非常有用的代码封装和抽象的方法,即:

外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为public。

以上就是浅谈Python中的模块的详细内容,更多关于python模块的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
使用scrapy实现爬网站例子和实现网络爬虫(蜘蛛)的步骤
Jan 23 Python
在Windows服务器下用Apache和mod_wsgi配置Python应用的教程
May 06 Python
Django与遗留的数据库整合的方法指南
Jul 24 Python
Linux下为不同版本python安装第三方库
Aug 31 Python
django项目环境搭建及在虚拟机本地创建django项目的教程
Aug 02 Python
python nmap实现端口扫描器教程
May 28 Python
给我一面国旗 python帮你实现
Sep 30 Python
python tkinter控件布局项目实例
Nov 04 Python
PyTorch里面的torch.nn.Parameter()详解
Jan 03 Python
基于Python生成个性二维码过程详解
Mar 05 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
Mar 23 Python
基于Python实现视频的人脸融合功能
Jun 12 Python
keras多显卡训练方式
Jun 10 #Python
使用SQLAlchemy操作数据库表过程解析
Jun 10 #Python
keras 多gpu并行运行案例
Jun 10 #Python
Keras自定义IOU方式
Jun 10 #Python
Python实现在线批量美颜功能过程解析
Jun 10 #Python
浅谈keras中的目标函数和优化函数MSE用法
Jun 10 #Python
keras 解决加载lstm+crf模型出错的问题
Jun 10 #Python
You might like
php侧拉菜单 漂亮,可以向右或者向左展开,支持FF,IE
2009/10/15 PHP
php 随机排序广告的实现代码
2011/05/09 PHP
php函数连续调用实例分析
2015/07/30 PHP
PHP文件上传类实例详解
2016/04/08 PHP
php 数组处理函数extract详解及实例代码
2016/11/23 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
2017/02/15 PHP
php PDO属性设置与操作方法分析
2018/12/27 PHP
一份老外写的XMLHttpRequest代码多浏览器支持兼容性
2007/01/11 Javascript
Extjs TriggerField在弹出窗口显示不出问题的解决方法
2010/01/08 Javascript
JQuery实现简单时尚快捷的气泡提示插件
2012/12/20 Javascript
利用JS判断用户是否上网(连接网络)
2013/12/23 Javascript
Jqgrid之强大的表格插件应用
2015/12/02 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
利用js编写响应式侧边栏
2016/09/17 Javascript
ES6中的rest参数与扩展运算符详解
2017/07/18 Javascript
nodejs连接mysql数据库及基本知识点详解
2018/03/20 NodeJs
npm scripts 使用指南详解
2018/10/08 Javascript
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python生成短uuid的方法实例详解
2018/05/29 Python
Django 多表关联 存储 使用方法详解 ManyToManyField save
2019/08/09 Python
python解析yaml文件过程详解
2019/08/30 Python
在Tensorflow中查看权重的实现
2020/01/24 Python
深入解读CSS3中transform变换模型的渲染
2016/05/27 HTML / CSS
分享30个新鲜的CSS3打造的精美绚丽效果(附演示下载)
2012/12/28 HTML / CSS
HTML5拖放功能_动力节点Java学院整理
2017/07/13 HTML / CSS
体育专业学生自我评价范文
2014/01/17 职场文书
有兼职工作经历的简历自我评价
2014/03/07 职场文书
人事任命书范文
2014/06/04 职场文书
员工生日会策划方案
2014/06/14 职场文书
检讨书范文500字
2015/01/28 职场文书
学校三八妇女节活动总结
2015/02/06 职场文书
大学感恩节活动总结
2015/05/05 职场文书
全国助残日活动总结
2015/05/11 职场文书
基于PyQT5制作一个桌面摸鱼工具
2022/02/15 Python
Python语言内置数据类型
2022/02/24 Python
Go语言 详解net的tcp服务
2022/04/14 Golang