Python学习笔记–4.模块
MrZigZag@Peking University
2015-07-15
1.模块
类似于Java中的Package,Python提供模块module
来将相关的代码打包。编写程序的时候可以使用内置模块,也可以使用第三方模块。
模块可以用于避免函数名冲突等问题,但是模块中尽量不要使用Python内置函数的函数名。
避免模块名相同,提供了按照目录来组织模块的方法,称为包package
,每个包都要有一个__init__.py
文件,表示这是一个package,可以空。因为__init__.py
本身就是一个模块,就表示包名。
包可以嵌套,组成多级多层次的包结构。
>MyPackage
>Web
__init__.py
http.py
__init__.py
pytest.py
http.py
2.创建和使用模块
以内置模块sys
为例,创建一个新模块test
。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
' a test module '
__author__ = 'MrZigZag'
import sys
def my_test():
if len(sys.argv) == 1: # no other arguments
print 'Hello World!'
elif len(sys.argv) == 2: # one other argument, treat as a name
print 'Hello %s!' % sys.argv[1]
else:
print 'Too many arguments!'
if __name__ == '__main__':
my_test()
前两行是标准注释,第四行是一个字符串,任何模块的第一个字符串都会被视为模块的文档注释,之后可以使用__author__
将作者写进去。
导入模块sys
之后,变量sys就指向该模块。
最后两两句话常用在测试当中,如果直接命令行执行该模块,解释器就会把__name__
置为__main__
,如果其他地方导入test
模块则不会,这一句就会失效。
>>> python test.py MrZigZag
Hello MrZigZag!
>>> python test.py
Hello World!
>>> python test.py 1 2
Too many arguments!
别名,可以给导入的模块赋别名。
import sys as SysModule
还可以在运行时根据当前环境选择最合适的模块,比如
try:
import cStringIO as stringIO
except ImportError: # catching import error
import stringIO
可以优先调用cStringIO
并且无论调用那个,执行时名称都是stringIO
。
函数的可访问性,模块中可以把外部不需要的函数全部定义成private,外部引用的定义为public。
将一个函数定义为private的,只需在命名上以_
开头,如def _private_function(name):
。
值得注意的是,__xxx__
之类一般都是特殊变量,可以直接被引用,但是有特殊用途,一般命名时避免使用这个格式。
3.安装模块
Python中第三方模块一般使用easy_install或者pip来安装,mac自带pip。
模块会有路径问题,加载模块时,Python会在指定的路径下搜索对应的.py文件。默认情况下,会搜索当前目录、所有已安装的内置模块和第三方模块,搜索路径放在sys模块的path变量中。要添加自己的搜索目录可以直接在sys.path
后面增加,但是在运行结束时失效。
>>> import sys
>>> sys.path
>>> sys.path.append('my_path')
4.使用__future__
Python3相对于Python2.x修改比较大,很多Python2.x的程序在Python3上无法正确运行,在Python2.x中要使用Python3的一些新特性可以使用__future__
模块。
from __future__ import unicode_literals
from __future__ import division