sound/ 顶层包
__init__.py 初始化 sound 包
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/ filters 子包
__init__.py
equalizer.py
vocoder.py
karaoke.py
...
注意点一
1 import sound.effects.echo
import 后到某一py文件,正确,但使用时必须用全名,即sound.effects.echo,最后一项不能是方法,类或者变量名
注意点二
import sound.effects 与 from sound.effects import *
上两语句看起来都是把sound文件夹下的effects下的内容都导入,但是你会发现,第一条和第二条语句,就算是用全名,也访问不到effects里面的py文件,当然访问不到py文件里的方法。原因是没有配置effects下的__init__.py,这里需要注意,这两条语句配置方式不同:
方式一:
在effects包中的__init__.py配置from .echo import f (这里f表示echo.py中的方法),第一条语句就可以顺利通过sound.effects.echo.f()或者直接sound.effects.f()访问f了,第二条语句可以直接echo.f()或者f()来访问了。
方式二:
在effects包中的_init__.py配置__all__=['echo'],此方法与上述方法类似,就是告诉python,在导入包effects时,把[]的内容给我一起导入(此时只导入echo)。不过区别是,第一条语句只能用sound.effects.echo.f(),第二条语句只能用echo.f()来访问f
------------------------
这两种方式体现了出,只要当一个包里有__init__.py时,并且配置了其内容,python才把这个包导入相应的内容,若一个包中没有__init__.py,python会当这个包为一个普通的包,不是一个python包。
from sound import effects
对于这种形式,必须走方式一,方式二不管用
注意点三
假设我们想使用numpy里的zeros()方法:
import numpy
numpy.zeros()
或者
from numpy import zeros
a=zeros()
import numpy.zeros
原因上面注意一提到过,不做过多描述。
这里想解释的是,numpy这个包为什么可以直接调用方法zeros?
根据注意点二来看,模型应该是注意点二第一条语句,又配置了方式一。
我们来找一个这个init文件:
首先我能发现提示zeros来自numpy.core.multiarray.
打开numpy的__init__.py文件,发现确实有,然后我打开core文件夹想找下multiarray,却没有找到,
然后看看core的__init__.py文件,发现有这句 ,from是从当前路径找multiarray呀。我core文件夹的当前路径没有multiarray,怎么回事呢??这个问题真是奇怪了,求大神解答