Python程序除了可以直接运行,还可以作为模块导入并使用其中的对象。通过__name__属性可以识别程序的使用方式。每个Python脚本在运行时都有一个__name__属性,如果脚本作为模块被导入,则其__name__属性的值被自动设置为模块名;如果脚本单独运行,则其__name__属性值被自动设置为字符串__main__。例如,假设程序 hellp.py中代码如下:
1 def main():
2 if __name__ == '__main__':
3
4 print('This program is run directly.')
5
6 elif __name__ == 'hello':
7
8 print('This program is used as a module.')
对于大型软件的开发,不可能把所有代码都放到一个文件中,那样会使得代码很难维护。对于复杂的大型系统,可以使用包来管理多个模块。包是Python用来组织命名空间和类的重要方式,可以看作是包含大量Python程序模块的文件夹。在包的每个目录中都包含一个__init__.py文件,该文件可以是一个空文件,用于表示当前文件夹是一个包。__init__py文件的主要用途是甚至__all__变量以及执行初始化包所需的代码,其中__all__变量中定义的对象可以在使用“from ... impor * ”时全部被导入。
假设有如下结构的包:
sound/ #Top-level package
__init__.py #Initialize the sound package
formats/ #Subpackage for file format conversions
__init__.py
wavread.py
aiffread.py
...
effects/ #Subpackage for sound effects
__init__.py
echo.py
surround.py
reverse.py
...
filters/ #Subpackage for filters
__init__.py
vocoder.py
karaoke.py
...
那么,可以在自己的程序中使用下面的代码导入其中一个模块:
import sound.effects.echo
然后使用完整名字来访问或调用其中的成员,例如:
sound.effects.echo.echofilter(input,output,delay=0.7,atten=4)
如果soundeffects\__init__.py文件中有下面一行的代码:
__all__=['echo','sourround','reverse']
那么就可以使用这样的方式来导入:
from sound.effects import *
然后使用下面的方式来使用其中的成员:
echo.echofilter(input,output,delay=0.7,atten=4)