Differences between revisions 6 and 16 (spanning 10 versions)
Revision 6 as of 2007-08-04 14:46:19
Size: 2459
Editor: brightman
Comment:
Revision 16 as of 2007-09-15 17:02:34
Size: 6098
Editor: brightman
Comment:
Deletions are marked like this. Additions are marked like this.
Line 2: Line 2:
##OBP项目图书reST通用文章模板
#format rst
:status: 草稿|校对|正式;HuangYi;完成度1%;
#pragma section-numbers on
||'''status''' || 草稿 ||brightman ||完成度90% ||
[[TableOfContents]]
Line 6: Line 6:
.. contents::

 . :depth: 3
=====
modulepackage =====
module ===== 为什么有module? 首先,你用Python实现的一些功能(python代码)可以保存为py文件,否则离开了Python解释器,就丢失了这些功能; 其次对于较大程序可以用文本编辑器开发,再Python将其作为输入来运行且某些些程序你可以拆分为多个较小py文件,便于维护。 最后,你想复用这些功能时只需要import它们,而不需要重复拷贝代码。 这module的功能,可以认为一个py文件就是一个module一个module是一个包含Python代码的文件,文件的名称就是module名称加上py后缀。举例来说:fibo.py
= 模块和包(module&package) =
== 模块(
module) ==
1.
为什么需要模块?
 比如
你用Python实现的一些功能(python代码),但是离开了Python解释器,就丢失了这些功能,所以用.py文件保存下来进而你可以使用专业的编辑器来编写程序,把保存好的文件输入Python解释器来运行;更进将复杂的程序拆分为多个.py文件,不仅便于维护,而且复用其中的功能,比如复用这些功能时只需要import它们,而不需要重复拷贝代码。 所有的一切是模块的功能,可以认为一个.py文件就是一个模块
2.模块的定义?
 模块是
包含Python定义和声明的文件,文件的名称就是模块名称加上.py后缀。
3.模块
举例
 
fibo模块(fibo.py)是一个实现Fibonacci功能的模块。
{{{#!python
Line 13: Line 16:
Line 15: Line 17:
Line 20: Line 21:
 . result = []
 . a, b = 0, 1
  . while b < n:
  . . result.append(b) a, b = b, a+b
 . return result
}}}
 在Python解释器中,使用import fibo导入fibo模块,使用fibo.fib(1000)来调用函数,也可以用fib = fibo.fib将模块函数赋值到本地函数。
{{{
>>> 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
}}}
4.搜寻模块的路径
 当你import fibo,Python解释器先在当前目录下搜寻fibo.py文件,如果没有找到,会依次在$PYTHONPATH指示的所有路径中搜寻。$PYTHONPATH的设定方法与$PATH是一样的,即多个目录路径的字符串。事实上,模块的搜寻路径是依照sys.path变量(多个路径组成的list变量)。当Python解释器启动时,会将当前目录、$PYTHONPATH、以及按照安装时设定的一些目录加入到sys.path变量中。所以可以修改这些参数来控制搜寻模块的路径。
Line 21: Line 43:
 . 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函数赋值到本地函数。
== 包(Packages) ==
1.为什么需要包?
 包是一种采用"."组织模块命名空间的方式。比如模块名称A.B表示是表示A 包中的模块 B。这种命名空间的组织方式能够避免不同模块命名的冲突。
2.包的组织方式
 假设你需要设计一组模块来处理声音文件和声音数据,就是如何组织一个包。由于存在多个不同声音格式的文件,你需要一个随时能增加新模块的包来处理新增的声音格式。另外还需要对声音进行各种不同处理(例如混声、加回音、加入平衡、加入人工音效等),所以还需要另写一些模块来作这些处理。下面这个结构可能符合你设计的包:
{{{
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将该目录识别为包。在最简单的例子中,__init__.py是一个空文件。当然你也可以让__init__.py做一些包的初始化动作,或者设定__all__变量。
3.如何使用?
 可以在package中import一个模块来使用,例如:
 import Sound.Effects.echo
 使用这个模块,必须使用完整的名字来调用,例如:
 Sound.Effects.echo.echofilter(input, output, delay=0.7, atten=4)
 另一种替代方法如:
 from Sound.Effects import echo
 不同的是,不需要包前缀,如下:
 echo.echofilter(input, output, delay=0.7, atten=4)
 另一种直接导入你需要的函数和变量的方法:
 from Sound.Effects.echo import echofilter
 使用方法如下:
 echofilter(input, output, delay=0.7, atten=4)
Line 27: Line 88:
>>> import fibo 4.from Sound.Effects import * 会怎么样?
 理想情况下,我们可能期望会搜寻整个package目录,然后搜寻所有的module并且一一import。但是,在Mac以及Windows平台下,文件的名称大小写不一致,所以无法保证所有的module被import。
Line 29: Line 91:
>>> fibo.fib(1000)  所以唯一解决的方法就是package的作者,要提供一个明确索引给使用package的人。如果遵守该习惯的话,当用package的人在import的时候使用from Sound.Effects import *,就会查找package中的__init__.py中的__all__这个list变量,该list就包含所有应该被import进来的module名称。
Line 31: Line 93:
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987  身为Package的作者有责任维护更新__init__.py。以Sounds/Effects/__init__.py为例:
Line 33: Line 95:
>>> fibo.fib2(100)  __all__ = ["echo", "surround", "reverse"]
Line 35: Line 97:
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]  表示from Sound.Effects import * 会import 这三个module。
Line 37: Line 99:
>>> fibo.__name__  如果没有定义__all__,from Sound.Effects import *不会保证所有的子module被导入。所以要么通过__init__.py,要么显式地import保证子module被导入。例如:
{{{
 import Sound.Effects.echo
 import Sound.Effects.surround
 from Sound.Effects import *
}}}
Line 39: Line 106:
'fibo'  值得注意的是import *不被鼓励,因为这样会降低程序的可读性,虽然有时会减少一些打字,而且有些module在设计时故意只让某些特别的名称可以被使用。
Line 41: Line 108:
>>> 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命令的冲突。 .. macro:: [[PageComment2(nosmiley=1, notify=1)]]

.. macro:: -- HuangYi [[[DateTime(2007-06-26T05:50:11Z)]]]
 最后,使用from Package import specific_submodule没有任何不对,除非你的module名称和其他名称冲突,将采用如下方式:
 from Package import specific_submodule as specific_submodule_alias

status

草稿

brightman

完成度90%

TableOfContents

1. 模块和包(module&package)

1.1. 模块(module)

1.为什么需要模块?

  • 比如你用Python实现的一些功能(python代码),但是离开了Python解释器,就丢失了这些功能,所以用.py文件保存下来; 进而你可以使用专业的编辑器来编写程序,把保存好的文件输入Python解释器来运行;更进而将复杂的程序拆分为多个.py文件,不仅便于维护,而且复用其中的功能,比如复用这些功能时只需要import它们,而不需要重复拷贝代码。 所有的这一切就是模块的功能,可以认为一个.py文件就是一个模块。

2.模块的定义?

  • 模块是包含Python定义和声明的文件,文件的名称就是模块名称加上.py后缀。

3.模块举例

  • fibo模块(fibo.py)是一个实现Fibonacci功能的模块。

   1 # Fibonacci numbers module
   2 def fib(n): # write Fibonacci series up to n
   3  . a, b = 0, 1
   4  while b < n:
   5   . print b, a, b = b, a+b
   6 def fib2(n): # return Fibonacci series up to n
   7  . result = [] 
   8  . a, b = 0, 1
   9   . while b < n:
  10   .  . result.append(b) a, b = b, a+b
  11  . return result
  • 在Python解释器中,使用import fibo导入fibo模块,使用fibo.fib(1000)来调用函数,也可以用fib = fibo.fib将模块函数赋值到本地函数。

>>> 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

4.搜寻模块的路径

  • 当你import fibo,Python解释器先在当前目录下搜寻fibo.py文件,如果没有找到,会依次在$PYTHONPATH指示的所有路径中搜寻。$PYTHONPATH的设定方法与$PATH是一样的,即多个目录路径的字符串。事实上,模块的搜寻路径是依照sys.path变量(多个路径组成的list变量)。当Python解释器启动时,会将当前目录、$PYTHONPATH、以及按照安装时设定的一些目录加入到sys.path变量中。所以可以修改这些参数来控制搜寻模块的路径。

1.2. 包(Packages)

1.为什么需要包?

  • 包是一种采用"."组织模块命名空间的方式。比如模块名称A.B表示是表示A 包中的模块 B。这种命名空间的组织方式能够避免不同模块命名的冲突。

2.包的组织方式

  • 假设你需要设计一组模块来处理声音文件和声音数据,就是如何组织一个包。由于存在多个不同声音格式的文件,你需要一个随时能增加新模块的包来处理新增的声音格式。另外还需要对声音进行各种不同处理(例如混声、加回音、加入平衡、加入人工音效等),所以还需要另写一些模块来作这些处理。下面这个结构可能符合你设计的包:

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将该目录识别为包。在最简单的例子中,init.py是一个空文件。当然你也可以让init.py做一些包的初始化动作,或者设定all变量。

3.如何使用?

  • 可以在package中import一个模块来使用,例如: import Sound.Effects.echo 使用这个模块,必须使用完整的名字来调用,例如: Sound.Effects.echo.echofilter(input, output, delay=0.7, atten=4) 另一种替代方法如: from Sound.Effects import echo 不同的是,不需要包前缀,如下: echo.echofilter(input, output, delay=0.7, atten=4) 另一种直接导入你需要的函数和变量的方法: from Sound.Effects.echo import echofilter 使用方法如下: echofilter(input, output, delay=0.7, atten=4)

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

ObpLovelyPython/LpyQLearn-6-model (last edited 2009-12-25 07:14:33 by localhost)