之前根据具体的应用情景写过一些关于Python模块的文章
Python中的模块与包
Python中第三方模块的安装
Python中如何解决ImportError:No Module Named arcpy问题
今天需要讨论一下Python模块内容如何编写的问题。
模块
Python将代码拆分为模块最初的目的是功能的独立,所以说模块提供的是某个独立的功能。作为函数式编程语言,Python模块的内容一般写为函数的形式。
#!/user/bin/env python3
# -*- coding:utf-8 -*-
'doc of a test module'
__author__ = 'XuZhiyuan'
from functools import reduce
def add(*args):
return reduce(_add_two,args)
def _add_two(x,y):
return x + y
def minus(x,y):
return x - y
def multi(*args):
return reduce(_multi_two, args)
def _multi_two(x,y):
return x * y
def divide(x,y):
if y == 0:
return None
return x / y
if __name__ == '__main__':
print(add(*range(100)))
print(minus(10,5))
print(multi(*range(1,10)))
print(divide(10,0))
print(divide(10,5))
print(__name__)
譬如上面是一个实现基本四则运算的模块。
第1、2行是标准注释,第1行的注释#!/user/bin/env python3
使得这个模块可以直接在Unix/Linux/Mac上运行,第2行注释# -*- coding:utf-8 -*-
表示文件使用标准的utf-8编码。
第4行是模块的文档注释,任何模块代码的第一个字符串都被当作是模块的文档注释。
第6行使用模块的__author__
变量写入模块的作者。
以上就是Python模块的标准文件模板,当然这些也可以不写,但还是建议按照标准格式构建模块。
接下来是模块的主要内容。首先需要import
模块使用到的标准库,然后是一系列函数实现模块的方法。
最后一部分代码if __name__ == '__main__'
需要特别注意,这是什么意思呢?
Python模块有很多属性和方法:
>>> dir(module)
['__author__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_add_two', '_multi_two', 'add', 'divide', 'math', 'minus', 'multi', 'reduce']
Python模块也是.py
文件,也是可以被直接运行的,当模块被直接运行时,模块的__name__
属性值为__main__
,所以可以在直接运行时写入一些调试语句;当模块被import
载入使用时,__name__
属性为模块的名称,所以就会自动忽略那些调试语句。
模块直接运行的结果如下:
D:\>python module.py
4950
5
362880
None
2.0
__main__
而被import
导入的使用方法如下:
>>> import module
>>> module
<module 'module' from 'D:\\module.py'>
>>> module.add(*range(100))
4950
什么?不知道自己写完模块怎么导入调用?看这里!
什么?这么多功能写到一个模块里面?当然,完全可以把它们写成Python包的形式。详见下一篇文章:Python包编写详解
(By XuZhiyuan 2016-06-18 10点 @Hohai Sunny)