转载自:http://www.xwy2.com/article.asp?id=120
Python 的 Module 更像 Object Pascal Unit,和 C# namespace 那种纯粹作为编译器名称识别符不同,Module 本身就是一种类型。
Code
>>>>>> import types
>>>>>> types.ModuleType
<type 'module'>
>>>>>> type(types)
<type 'module'>
>>>>>>
我们可以在 Module 中定义变量、方法、类以及其他执行代码。
Code
>>>>>> i = 15
>>>>>> def test():
pass
>>>>>> class Class1:
pass
>>>>>> print "Hello Python"
Hello Python
通过 __name__ 可以判断当前 module 是被 import 还是 execute。
Code
>>>>>> if __name__=="__main__":
print "Execute"
else:
print "Import"
Execute
>>>>>>
可以使用 dir() 方法查看 module 的成员。
Code
>>>>>> import sys
>>>>>> dir(sys)
['__displayhook__', '__doc__', '__excepthook__', '__name__', '__stderr__', '__stdin__', '__stdout__', '_current_frames', '_getframe', 'api_version', 'argv', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats', 'copyright', 'displayhook', 'dllhandle', 'exc_clear', 'exc_info', 'exc_traceback', 'exc_type', 'exc_value', 'excepthook', 'exec_prefix', 'executable', 'exit', 'getcheckinterval', 'getdefaultencoding', 'getfilesystemencoding', 'getrecursionlimit', 'getrefcount', 'getwindowsversion', 'hexversion', 'maxint', 'maxunicode', 'meta_path', 'modules', 'path', 'path_hooks', 'path_importer_cache', 'platform', 'prefix', 'setcheckinterval', 'setprofile', 'setrecursionlimit', 'settrace', 'stderr', 'stdin', 'stdout', 'subversion', 'version', 'version_info', 'warnoptions', 'winver']
>>>>>> dir()
['Class1', '__builtins__', '__doc__', '__name__', 'i', 'sys', 'test']
作为引入机制,我们可以用两种方法来导入其他 module 成员。
Code
>>>>>> import sys
>>>>>> sys.version
'2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)]'
>>>>>> from sys import version
>>>>>> version
'2.5.1 (r251:54863, Apr 18 2007, 08:51:08) [MSC v.1310 32 bit (Intel)]'
>>>>>> from sys import *
>>>>>> winver
'2.5'
>>>>>>
除了使用 import 关键字以外,我们还可以使用内建函数 __import__() 来导入 module。两者的区别是,import 后面跟的必须是一个类型(type),而__import__() 的参数是一个字符串,这个字符串可能来自配置文件,也可能是某个表达式计算结果,这显然为我们提供了更大的灵活性。
Code
>>>>>> m1=__import__("sys")
>>>>>> type(m1)
<type 'module'>
>>>>>> m1.winver
'2.5'
>>>>>>
使用 import 导入 module 时,Python 会将要导入的 module 编译成字节码,这种二进制文件(.pyc)虽然没有提高执行速度,但能加快装载速度。我们还可以调用相关方法来完成编译行为。
Code
>>>>>> import py_compile
>>>>>> py_compile.compile("e:\\Users\\py\\hello.py") # 编译单个 .py 文件
>>>>>> import compileall
>>>>>> compileall.compile_dir("e:\\Users\\py") # 编译指定目录下的所有 .py 文件
Listing e:\Users\py
1
>>>>>>
Python 通过 PYTHONPATH 环境变量来查找 module,我们可以使用 sys.path 来查看或添加新的路径。
Code
>>>>>> sys.path
['D:\\Python25\\Lib\\idlelib', 'C:\\WINDOWS\\system32\\python25.zip', 'D:\\Python25\\DLLs', 'D:\\Python25\\lib', 'D:\\Python25\\lib\\plat-win', 'D:\\Python25\\lib\\lib-tk', 'D:\\Python25', 'D:\\Python25\\lib\\site-packages']
>>>>>> sys.path.append("e:\\Users\\py")
>>>>>> sys.path
['D:\\Python25\\Lib\\idlelib', 'C:\\WINDOWS\\system32\\python25.zip', 'D:\\Python25\\DLLs', 'D:\\Python25\\lib', 'D:\\Python25\\lib\\plat-win', 'D:\\Python25\\lib\\lib-tk', 'D:\\Python25', 'D:\\Python25\\lib\\site-packages', 'e:\\Users\\py']
>>>>>>
Package
我们可以将多个 module 组合成一个 package。
方法很简单:
1. 在 Python\Lib 或者其他可以被搜索到的路径下创建一个子文件夹,文件夹名就是包名称。
2. 将所有需要加入的 module 放到该子文件夹中。
3. 创建一个包含代码或为空的 __init__.py 文件。在第一次 import 该包时,该文件会被自动执行。
在 import 该包的时候,需要添加包名称前缀。
Code
>>>>>> import mypackage
>>>>>> import mypackage.module1
>>>>>> from mypackage import *
>>>>>> from mypackage.module1 import *