Python中的 __all__和__path__ 解析

来源:互联网 发布:烘焙论坛知乎 编辑:程序博客网 时间:2024/04/29 20:21

Python以目录来组织模块, 就是所谓的包. 用包的一大好处: 可以解决名字空间冲突的问题, 即文件重名问题. 
    下面主要说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:~/tmpcat Sound/Utils/echo.py  
print "I'm Sound.Utils.echo"  
ltt@hz171-14:~/tmpcat Sound/Utils/Windows/echo.py    
print "I'm Windows.echo"  
ltt@hz171-14:~/tmpcat 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  
原文链接
0 0
原创粉丝点击