1.4.3 編寫自己的模塊和包
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 6elif __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)
如果sound\effects\__init__.py文件中有下面一行的代碼:
__all__=[‘echo‘,‘sourround‘,‘reverse‘]
那麽就可以使用這樣的方式來導入:
from sound.effects import *
然後使用下面的方式來使用其中的成員:
echo.echofilter(input,output,delay=0.7,atten=4)
1.4.3 編寫自己的模塊和包