浅谈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 相关文章推荐
基于wxpython实现的windows GUI程序实例
May 30 Python
CentOS中使用virtualenv搭建python3环境
Jun 08 Python
python实现手机通讯录搜索功能
Feb 22 Python
Python Logging 日志记录入门学习
Jun 02 Python
Python if语句知识点用法总结
Jun 10 Python
python实现猜拳游戏
Mar 04 Python
什么是Python中的顺序表
Jun 02 Python
Django实现任意文件上传(最简单的方法)
Jun 03 Python
在keras里面实现计算f1-score的代码
Jun 15 Python
Python函数调用追踪实现代码
Nov 27 Python
pandas 数据类型转换的实现
Dec 29 Python
基于tensorflow权重文件的解读
May 26 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 反向排序和随机排序代码
2010/06/30 PHP
用PHP书写安全的脚本代码
2012/02/05 PHP
PHP缓存机制Output Control详解
2014/07/14 PHP
php 自定义错误日志实例详解
2016/11/12 PHP
jquery 插件开发方法小结
2009/10/23 Javascript
jQuery EasyUI API 中文文档 - ComboTree组合树
2011/10/11 Javascript
javascript常用对话框小集
2013/09/13 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
javascript+canvas实现刮刮卡抽奖效果
2015/07/29 Javascript
浅谈jQuery为哪般去掉了浏览器检测
2016/08/29 Javascript
使用smartupload组件实现jsp+jdbc上传下载文件实例解析
2017/01/05 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
vue中各组件之间传递数据的方法示例
2017/07/27 Javascript
Vue组件实例间的直接访问实现代码
2017/08/20 Javascript
基于jquery.page.js实现分页效果
2018/01/01 jQuery
angularjs获取到My97DatePicker选中的值方法
2018/10/02 Javascript
详解如何给React-Router添加路由页面切换时的过渡动画
2019/04/25 Javascript
vue中beforeRouteLeave实现页面回退不刷新的示例代码
2019/11/01 Javascript
Python基于hashlib模块的文件MD5一致性加密验证示例
2018/02/10 Python
python实现超市扫码仪计费
2018/05/30 Python
Python ATM功能实现代码实例
2020/03/19 Python
Win10用vscode打开anaconda环境中的python出错问题的解决
2020/05/25 Python
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
ANINE BING官方网站:奢华的衣橱基本款和时尚永恒的单品
2019/11/26 全球购物
如何理解委托
2012/01/06 面试题
《小蝌蚪找妈妈》教学反思
2014/02/21 职场文书
2014小学植树节活动总结
2014/03/10 职场文书
课外活动总结范文
2014/07/09 职场文书
应急管理工作总结2015
2015/05/04 职场文书
人口与计划生育责任书
2015/05/09 职场文书
《包身工》教学反思
2016/02/23 职场文书
私人贷款担保书该怎么写呢?
2019/07/02 职场文书
小学语文的各类谚语(70首)
2019/08/15 职场文书
详解JAVA中的OPTIONAL
2021/06/14 Java/Android
MySQL中CURRENT_TIMESTAMP的使用方式
2021/11/27 MySQL
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android