Python3.x那些事儿:[46]包

2025-10-24 06:42:31

包是组织模块的一种有效方式。例如:A.B就是A包中的一个B模块。就像每个模块的作者不用担心是否会跟其他模块中的符号表冲突一样,包的作者也不用担心自己包中的模块会跟其他包冲突。例如:Numpy和PIL包的作者就不用担心彼此的模块会冲突。

假设现在你要写一系列的模块来统一处理声音文件和声音数据。有很多的声音文件类型,如.wav, .aiff, .au等等。因此你要编写和维护越来越多的文件格式模块。而且你也想在声音数据上进行多种操作,如声音混合,添加音效等。因此你会发现你要写的代码越来越多,无穷无尽。这些文件就可以组成一个包,包的结构如下。

sound/ 

    __init__.py 

    formats/ 

        __init__.py 

        wavread.py 

        wavwrite.py 

        aiffread.py 

        aiffwrite.py 

        auread.py 

        auwrite.py 

        ... 

    effects/ 

        __init__.py 

        echo.py 

        surround.py 

        reverse.py 

        ... 

    filters/ 

        __init__.py 

        equalizer.py 

        ocoder.py 

        karaoke.py 

        ...

当用import导入该包时,解释器就会在sys.path中进行查找包的子目录。__init__.py是一个必备的文件,只有文件夹中含有这个文件,Python解释器才会把这个文件夹当成是一个包。这样也避免了一个普通的文件夹名称如string被导入从而掩盖掉后续的有效模块。在最简单的情况下,__init__.py就是一个空文件,当然它也可以执行一些初始化代码,或者设置__all__变量等。

可以只导入包的个别模块,如:

import sound.effects.echo

这句代码就会导入模块sound.effects.echo,引用的时候要引用全称。例如:

sound.effects.echo.echofilter(input,output,delay=0.7,atten=4)

导入个别模块的另外一种方法是:

from sound.effects import echo

这句代码也可以导入该模块,但是引用的时候就方便多了。

echo.echofilter(input,output,delay=0.7,atten=4)

当然还可以直接导入想要使用的函数或者变量。

from sound.effects.echo import echofilter

这个时候再调用就应该是这样的:

echofilter(input,output,delay=0.7,atten=4)

注意:当使用from package import item这种方式时,item可以是一个子包,也可以是一个子模块,还可以使包中定义的其他名字,如变量,函数,类等。

当import语句执行时,会首先检查item是不是包中定义的,如果不是,就把它当作一个模块进行导入,如果导入失败,则会抛出ImportError错误。

对于import item.subitem.subsubitem方式来说,除了subsubitem之外,其他两个必须为包,最后一个可以是一个包,也可以是一个模块,但是不能是上一个包中定义的类,函数,或者变量等。

(共篇)上一篇:dir()函数|下一篇:
声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢