http://tiffanylam2010.blog.163.com/blog/static/17078035120116250553238/
ython以目錄來組織模塊, 就是所謂的包. 用包的一大好處: 可以解決名字空間沖突的問題, 即文件重名問題.
下面主要說3點:
1. 如何使一個目錄變成包,如何import
目錄下放一個__init__.py文件(內容可以為空), import包內模塊的時候使用"."分割, 比如import Apackage.Amodule
2. __init__.py的__all__變量
__all__指定的是指此包被import * 的時候, 哪些模塊會被import進來
3. __init__.py的__path__變量
__path__指定了包的搜索路徑
下面是以舉例的方法來介紹:
1. 如何使一個目錄變成包,如何import
在目錄下, 放一個__init__.py文件, 這該目錄會被認為包. __init__.py文件, 可以為空. 當一個包被import的時候, 會首先加載它的__init__.py文件, 一般可以在__init__.py文件中進行初始化. 需要用到包中模塊,import的時候使用"."分割.
比如:
Sound/ 包
|-- Effects Sound的一個子包
| |-- __init__.py
| |-- errors.py
| `-- iobuffer.py
|-- Filters Sound的一個子包
| |-- __init__.py
| |-- dolby.py
| |-- equalizer.py
| |-- karaoke.py
| `-- vocoder.py
|-- Utils Sound的一個子包
| |-- __init__.py
| |-- echo.py
| |-- reverse.py
| `-- surround.py
`-- __init__.py 文件夾下放一個__init__.py文件, 則此文件夾為包
需要用到Sound/Utils/echo.py, 則:
2. __init__.py的__all__變量
__all__: __init__.py的常用變量__all__指定的是指此包被import * 的時候, 哪些模塊會被import進來.
舉例:
Sound/__init__.py是一個空文件, 則:
>>> dir ()
[ '__builtins__' , '__doc__' , '__name__' ]
在Sound/__init__.py中, 寫一行:
則:
>>> from Sound import *
>>> dir ()
[ 'Effects' , 'Filters' , 'Utils' , '__builtins__' , '__doc__' , '__name__' ]
3. __init__.py的__path__變量
__path__: __init__.py的常用變量__path__, 默認情況下只有一個元素, 就是當前包的路徑, 修改__path__, 可以修改此包內的搜索路徑.
舉例:
在Utils下增加2個目錄Linux和Windows, 並各有一個echo.py文件, 目錄如下
Sound/Utils/
|-- Linux 目錄下沒有__init__.py文件, 不是包, 只是一個普通目錄
| `-- echo.py
|-- Windows 目錄下沒有__init__.py文件, 不是包, 只是一個普通目錄
| `-- echo.py
|-- __init__.py
|-- echo.py
|-- reverse.py
`-- surround.py
三個echo.py的文件內容如下:
ltt @hz171 - 14 :~/ tmp $ cat Sound / Utils / echo . py
print "I'm Sound.Utils.echo"
ltt @hz171 - 14 :~/ tmp $ cat Sound / Utils / Windows / echo . py
print "I'm Windows.echo"
ltt @hz171 - 14 :~/ tmp $ cat Sound / Utils / Linux / echo . py
print "I'm Linux.echo"
Sound/Utils/__init__.py是空文件,則結果如下:
>>> import Sound . Utils . echo
I 'm Sound.Utils.echo
把Sound/Utils/__init__.py改成:
import os
print "Sound.Utils.__init__.__path__ before change:" , __path__
dirname = __path__ [ 0 ]
if sys . platform [ 0 : 5 ] == 'linux' :
__path__ . insert ( 0 , os . path . join ( dirname , 'Linux' ) )
else :
__path__ . insert ( 0 , os . path . join ( dirname , 'Windows' ) )
print "Sound.Utils.__init__.__path__ AFTER change:" , __path__
則結果如下:
Sound . Utils . __init__ . __path__ before change : [ 'Sound/Utils' ]
Sound . Utils . __init__ . __path__ AFTER change : [ 'Sound/Utils/Linux' , 'Sound/Utils' ]
I'm Linux.echo