您的位置:首页 > 其它

__all__

2016-07-09 18:42 246 查看


关于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  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: