詳解Python項目開發時自定義模塊中對象的導入和使用
來自專欄 python
背景: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 *時哪些子模塊或對象會被自動導入。
推薦閱讀:
※Django 的最佳開發實踐有哪些?
※Django寫的博客工具?
※大家是怎麼實現tornado的mysql非同步的,tornado與mysql在一起需要怎麼技術的技術實現好?
※python開發後台,該從哪裡開始,學習過程?
※安裝flask的virtualenv環境總是失敗?好蛋疼哦?