Module
Python module就是一个普通的python脚本,也就是.py文件。Module让我们更好的组织相关的代码。例如,我们可以把数学运算相关的函数,变量,类等都放入math module。
创建一个mymodule.py文件,就定义了一个名为mymodule的module:
foo = 100
def hello():
print("i am from mymodule.py")
在其他python代码中,我们可以很方便导入这个module并使用其中的代码:
import mymodule
print(mymodule.foo)
print(mymodule.hello())
如果不想导入module中的所有逻辑,仅仅想导入一部分,则使用“from”关键字:
from mymodule import foo # 仅使用foo变量
print(foo)
Package
Package是用来组织项目中module的一种命名空间。同时Package可以是多层级结构,在文件系统中以多层目录的形式表达。
例如一个module名为A.B则意味着,module B属于package A。又如一个module名为A.B.C则意味着,A为第一级package,B为第二级package,C为module名称。
下面是一个package组织关系的例子:
sound/ Top-level package
__init__.py Initialize the sound package
formats/
__init__.py
wavread.py
wavwrite.py
...
effects/ Subpackage for sound effects
__init__.py
echo.py
...
filters/ Subpackage for filters
__init__.py
equalizer.py
vocoder.py
...
可以注意到每层package目录下都有一个__init__.py文件。Python发现__init__.py文件,就知道这是一个package。当导入一个package时,Python会查找sys.path中的所有目录和子目录。
大多数情况下__init__.py是空的,但也可以加入package初始化代码。这样当package被引用时,初始化代码会被执行。
用户可以导入package下特定的module:
import sound.formats.wavread
sound.formats.wavread.hello() # 注意这里需要把import后的内容都重复一遍,很不方便。因此:
import sound.formats.wavread as tag # 这样就方便多了。
另外一种写法:
from sound.formats import wavread
wavread.hello() # 这样就方便多了。
也可以导入特定module中的函数:
from sound.formats.wavread import echofilter
echofilter() # 可以直接调用函数了。
在__init__.py中使用__all__参数:
__all__ = ["echo", "surround", "reverse"]
上面的语句表示,当运行“from sound.effects import *”时,导入"echo", “surround”, "reverse"3个module。也就是说import * 表示导入__all__指定的所有module。