如何构建python的包

 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
原文链接:http://tiffanylam2010.blog.163.com/blog/static/17078035120116250553238/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值