Python3模块(v3.7)

[TOC]

模块定义与规范

Python中每个.py文件被称为一个模块,按目录组织模块的方法被称为。模块可以避免变量和函数名冲突,而包可以避免模块名冲突。

每个包目录下面都必须有一个__init__.py文件,否则Python会把这个目录当成普通目录,而不是一个包。__init__.py可以是一个空文件,也可以有Python代码。因为__init__.py本身就是一个模块,它的模块名是其所在目录的包名。
自定义模块时要注意命名,不要与系统模块重名,否则导致命名冲突无法导入系统模块

1
2
3
4
5
leancomment	   #普通目录没有__init__.py
|_ utils #包名utils
| |_ convert.py #模块名utils.convert
| |_ __init__.py #模块名utils
|_ start.py #模块名start

模块模板

通常一个模块排版如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env python3  #指定运行环境,可以让py文件在Unix/Linux/Mac下运行
# -*- coding: utf-8 -*- # 注释表示文件采用utf-8编码

'此处为文档注释'

--author__ = 'Windus' #模块作者

import sys #导入模块

...省略   #自定义模块内容

if __name__=='__main__': #命令行运行测试
...省略

在命令行运行模块文件时,Python解释器会把一个特殊变量name赋值为’main‘,而在其它地方导入模块时不会如此操作,因此上面if判断可以通过命令行如测试执行代码等,有些类似其它语言的main函数。

模块作用域

Python中想要仅在模块内使用的私有函数或变量,可以通过_前缀来实现。正常函数和变量是公开的可以被其它模块引用,而以_开头的函数或变量不应该被其它模块引用。

自定义工具模块utils.convert

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env python3
# -*-coding: utf-8 -*-

'工具模块-转换函数'
__author__ = 'Windus'

import functools

def _exponent(n,m) :
temp = n
while m > 1 :
m -= 1
n *= temp
return n

exponent2 = functools.partial(_exponent,m=2)

if __name__ =='__main__' :
print(exponent2(5))

自定义应用模块:app:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/usr/bin/env python3
# -*-coding: utf-8 -*-

'装饰器函数'
__author__ = 'Windus'

import utils.convert #引入工具模块

def log(level):
def decorator(func):
def wrapper(*args, **kw):
print('[[%s]] 执行%s()' % (level, func.__name__))
return func(*args, **kw)
return wrapper
return decorator


@log(level='DEBUG')
def test2():
print(utils.convert.exponent2(8)) #调用exponent2函数,不应该调用_exponent函数

if __name__ == '__main__' :
test2()

Python中没限制调用私有函数或变量的调用机制,而是从编程习惯上不应该被引用。