__all__

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

你可能感兴趣的:(__all__)