|
Size: 5979
Comment:
|
Size: 186
Comment:
|
| Deletions are marked like this. | Additions are marked like this. |
| Line 4: | Line 4: |
| :status: 草稿|校对|正式;brightman;完成度30%; | ||status|| 草稿||brightman||完成度30%|| |
| Line 6: | Line 6: |
| .. contents:: . :depth: 3 ===== module与package ===== module ===== 为什么有module? 首先,你用Python实现的一些功能(python代码)可以保存为py文件,否则离开了Python解释器,就丢失了这些功能; 其次对于较大程序可以用文本编辑器开发,再Python将其作为输入来运行,而且某些些程序你可以拆分为多个较小py文件,便于维护。 最后,你想复用这些功能时只需要import它们,而不需要重复拷贝代码。 这些就module的功能,可以认为一个py文件就是一个module。 一个module是一个包含了Python代码的文件,文件的名称就是module名称加上py后缀。举例来说:fibo.py # Fibonacci numbers module def fib(n): # write Fibonacci series up to n . a, b = 0, 1 while b < n: . print b, a, b = b, a+b def fib2(n): # return Fibonacci series up to n . result = [] a, b = 0, 1 while b < n: . result.append(b) a, b = b, a+b return result 在Python解释器中 使用import fibo导入fibo module 和 使用fibo.fib(1000)来调用函数,也可以用fib = fibo.fib 将module函数赋值到本地函数。 >>> import fibo >>> fibo.fib(1000) 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 >>> fibo.fib2(100) [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] >>> fibo.__name__ 'fibo' >>> fib = fibo.fib >>> fib(500) . 1 1 2 3 5 8 13 21 34 55 89 144 233 377 搜寻module的路径 ===== 当你import spam,python解释器现在当前目录下搜寻spam.py,如果没有找到,会依次在$PYTHONPATH指示的所有路径中搜寻。$PYTHONPATH的设定方法与$PATH是一样的,即多个目录路径的字符串。事实上,module的搜寻路径是依照sys.path变量(多个路径组成的list变量)。当Python解释器启动时,会将当前目录、$PYTHONPATH、以及按照安装时设定的一些目录加入到sys.path中。如果你有把握,可以修改这些参数来该表搜寻module的路径。 Packages ===== Package是一种采用"."组织module 命令空间的方式。比如module名称A.B表示是表示A package中的module B。这种命名空间的组织方式能够避免不同module命令的冲突。 假设你需要设计一组module(就是组织一个package)来处理声音文件和声音数据。由于存在多个不同声音格式的文件,你需要一个随时能增加新module的package来处理新增的声音格式。另外还需要对声音进行各种不同处理(例如混声、加回音、加入平衡、加入人工音效等),所以还需要另写一些module来作这些处理。下面这个结构可能符合你设计的package: Sound/ Top-level package __init__.py Initialize the sound package Formats/ Subpackage for file format conversions __init__.py wavread.py wavwrite.py aiffread.py aiffwrite.py auread.py auwrite.py ... Effects/ Subpackage for sound effects __init__.py echo.py surround.py reverse.py ... Filters/ Subpackage for filters __init__.py equalizer.py vocoder.py karaoke.py ... __init__.py是必须的,帮助Python将该目录识别为package。在最简单的例子中,__init__.py多是一个空文件。当然你也可以让__init__.py做一些package初始化的动作,或者设定__all__变量。 可以在package中import一个model来使用,例如: import Sound.Effects.echo 使用这个module,必须使用完整的名字来调用,例如: Sound.Effects.echo.echofilter(input, output, delay=0.7, atten=4) 另一种替代方法如: from Sound.Effects import echo 不同的是,不需要package前缀,如下: echo.echofilter(input, output, delay=0.7, atten=4) 再一种直接导入你需要的函数和变量的方法: from Sound.Effects.echo import echofilter 使用方法如下: echofilter(input, output, delay=0.7, atten=4) from Sound.Effects import * 会怎么样?理想情况下,我们可能期望会搜寻整个package目录,然后搜寻所有的module并且一一import。但是,在Mac以及Windows平台下,文件的名称大小写不一致,所以无法保证所有的module被import。 所以唯一解决的方法就是package的作者要提供一个明确索引给使用package的人。如果遵守该习惯的话,当用package的人在import的时候使用from Sound.Effects import *,就会查找package中的__init__.py中的__all__这个list变量,该list就包含所有应该被import进来的module名称。身为Package的作者有责任维护更新__init__.py。以Sounds/Effects/__init__.py为例: __all__ = ["echo", "surround", "reverse"] 表示from Sound.Effects import * 会import 这三个module。 如果没有定义__all__,from Sound.Effects import *不会保证所有的子module被导入。所以要么通过__init__.py,要么显式地import保证子module被导入。例如: import Sound.Effects.echo import Sound.Effects.surround from Sound.Effects import * 值得注意的是import *不被鼓励,因为这样会降低程序的可读性,虽然有时会减少一些打字,而且有些module在设计时故意只让某些特别的名称可以被使用。 最后,使用from Package import specific_submodule没有任何不对,除非你的module名称和其他名称冲突,将采用如下方式: from Package import specific_submodule as specific_submodule_alias .. macro:: [[PageComment2(nosmiley=1, notify=1)]] .. macro:: -- HuangYi [[[DateTime(2007-06-26T05:50:11Z)]]] |
[[TableOfContents]] = 模块和包(module&package) = == module == |
||status|| 草稿||brightman||完成度30%|| [[TableOfContents]] = 模块和包(module&package) = == module ==
