背景:1)任何一個Python程序文件既可以直接執行,也可以作為模塊導入再使用其中的對象;2)對於大型系統開發,一般不會把所有代碼放到單個文件中,而是根據功能將其分類並分散多個模塊中,在編寫小型項目時最好也能養成這樣的好習慣。
本文介紹Python自定義模塊中對象的導入和使用。
假設當前工作目錄為C:\Python36,創建一個子目錄child,然後在其中創建一個Python程序文件add.py,其中的代碼為:
def add(x, y):
return x+y
這時,文件夾結構如圖所示:
現在我們啟動IDLE交互編程模式,默認工作目錄是C:\Python36,執行下面的代碼:
>>> import child
>>> child.add.add(3,5)
Traceback (most recent call last):
File "<pyshell#17>", line 1, in <module>
child.add.add(3,5)
AttributeError: module 'child' has no attribute 'add'
錯誤提示顯示,child模塊中沒有可用的add,這是因為child文件夾被認為是一個包,而add.py是包中的子模塊,並沒有隨著child一起導入。繼續執行下面的代碼:
>>> import child.add
>>> child.add.add(3,5)
8
自定義模塊中的對象成功被導入並能夠正常使用,也就是說,如果要使用的對象在子模塊中,應該單獨使用import來導入子模塊。或者使用下面的方法:
>>> from child import add
>>> add.add(3,5)
8
接下來在IDLE中單擊菜單“Restart Shell”恢復初始狀態,然後執行下面的代碼:
>>> from child import *
>>> add.add(3,5)
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
add.add(3,5)
NameError: name 'add' is not defined
錯誤提示顯示並不存在add這樣的名字,也就是說命令from child import *並沒有導入add模塊。現在在child子文件夾中創建一個Python程序文件__init__.py,其中內容為:
__all__ = ['add']
此時文件夾結構變為:
然後回到IDLE中執行剛才的代碼:
>>> from child import *
>>> add.add(3,5)
8
結果正常。原因在於,如果文件夾作為包來使用,並且其中包含__init__.py文件時,__init__.py文件中的特殊列表成員__all__用來指定from ... import *時哪些子模塊或對象會被自動導入。
End.
來源:公眾號“Python小屋”
運行人員:中國統計網小編(微信號:itongjilove)
微博ID:中國統計網
中國統計網,是國內最早的大數據學習網站,公眾號:中國統計網
http://www.itongji.cn