模块介绍
在python中,一个 集合代码的**.py** 文件就称之为一个模块,提高了代码的可维护性。在编写程序的时候也常引用其它模块,包括内置和第三方的模块。
编写模块的时候,要尽量不与内置函数名冲突,也不与系统模块名相同,可以利用import方式验证系统是否存在这样名称的模块,但不必考虑名字会与其它模块冲突,因为相同的函数名和变量名可以存在不同的模块中。 如果模块名也相同的话,python又引入了 目录 来组织模块的方法,称为 “包” 。如abc.py模块名就变成了mycompany.abc。
注意: 每个包的目录下都会有一个 __init__.py 文件,这个文件是必须存在的,否则python不会把这个目录当成包,而是当成普通的目录。同时,还可以设置多级层次的包结构。
模块的标准文件模板
#!/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行注释可以让这个hello.py文件直接在Unix/Linux/Mac上 运行
- 第2行注释表示.py文件本身使用标准UTF-8 编码;
- 第4行是一个字符串,表示模块的 文档注释,任何模块代码的第一个字符串都被视为模块的文档注释;
- 第6行使用__author__变量把 作者 写进去,这样当你公开源代码后别人就可以瞻仰你的大名;
- 中间部分就是模块的核心内容了
- 最后两行 __name__==’__main__’ 的作用由下面细讲:
__name__==’__main__’ 介绍:
python属于脚本语言,不像类似C、C++、Java这样的编译型语言将程序编译成二进制在运行,而是动态的逐行解释运行,也就是 脚本从第一行开始运行,没有统一的入口。
例子说明:
"""这个是const.py代码"""
PI=3.14
def main():
print(PI)
main()
"""运行结果为:"""
3.14
"""这个是area.py的代码"""
from const import PI
def main():
print(PI*2)
main()
"""在pycharm里右击该文件运行(不是Alt+Shift+E这样的运行)结果如下:"""
3.14
6.28
- 可以看到 area.py 文件的运行把导入的 const.py 模块的内容也执行了,这个不是我们想要的,因此就利用到了__name__属性:
- 自己运行自己的代码,不运行导入的模块:__name__ == ‘__main__’
- if __name__==’__main__’:相当有python的程序入口
帮助理解:
朋友眼中你是小明(__name__ == ‘小明’),
你自己眼中你是你自己(__name__ == ‘__main__’),
你编程很好, 朋友调你去帮他写程序(import 小明, 这时你在朋友眼中: __name__ == ‘小明’),
但你晚上也会打开xx网站, 做一些自己的事情(直接运行小明 .py, __name__ == ‘__main__’)
模块中函数和变量
在一个模块中,部分函数和变量是希望被别人使用的,部分是希望只在模块内使用的。
- 正常的函数和变量名是公开的public,如abc
- 类似__xxx__格式的变量名是特殊变量,有特殊含义,如__author__、__name__
- 类似__xxx和_xxx这样的函数和变量是非公开的private ,不能直接被引用。