包和模块
包:包里面可以有多个子包,子包里面又可以有多个模块;
模块:一个.py文件就是一个模块。
一般包目录下都会定义__init__.py
,在__init__.py
中存在一个叫做 __all__
的列表变量,在使用 from package import *
的时候就把这个列表中的所有名字作为包内容导入;如果__all__
没有定义,那就不会导入任何模块。
一种可能的包的结构(sound包):
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
...
记录一些遇到的问题,
假设现在有这样一个包:
在 ani
包中的 cat
模块里有say()
函数定义,如何在tree
模块和peo
模块中进行调用呢,或者说如何导入cat
模块?
peo
模块导入cat
模块:
# 1
import ani.cat
ani.cat.say()
cat.say() # 错误!
# 2
import ani.cat as cat
cat.say()
# 3
from ani.cat import say
say()
# 4
from ani import cat
cat.say()
tree
模块导入cat
模块:
# 错误的相对引用
from ..ani import cat # 错误!
cat.say()
ImportError: attempted relative import with no known parent package
from ani import cat # 正确
cat.say()