關於python的pakage和module __all__ __path__的介紹


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, 則:   

 
import   Sound . Utils . echo
 

2. __init__.py的__all__變量 

       
    __all__: __init__.py的常用變量__all__指定的是指此包被import * 的時候, 哪些模塊會被import進來. 
    舉例: 
        Sound/__init__.py是一個空文件, 則:

 
>>>   from   Sound   import   *  
>>>   dir ()   
[ '__builtins__' ,   '__doc__' ,   '__name__' ]  
 

 

        在Sound/__init__.py中, 寫一行:

 
__all__   =   [ 'Effects' ,   'Filters' ,   'Utils' ]
 
 
 

則:


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

則結果如下: 

 
>>>   import   Sound . Utils . echo  
Sound . Utils . __init__ . __path__   before   change :   [ 'Sound/Utils' ]    
Sound . Utils . __init__ . __path__   AFTER   change :   [ 'Sound/Utils/Linux' ,   'Sound/Utils' ]    
I'm Linux.echo  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM