詳解Python項目開發時自定義模塊中對象的導入和使用

詳解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環境總是失敗?好蛋疼哦?

TAG:Python | Python框架 |