從C#到Python —— 5 模組和包

來源:互聯網
上載者:User

 

本章是《從C#到Python》系列連載的最後一章,內容較簡單,主要介紹Python中模組與包的使用方法。如果你對這部分內容已經比較熟悉,就不要再浪費時間看了,寫這一章只是為了整個系列完整而已,沒什麼新的東西(本章內容主要參考了《Python精要參考》的第八章《模組和包》)。

 

5.1  模組

Python的指令碼都是用副檔名為py的文字檔儲存的,一個指令碼可以單獨運行,也可以匯入另一個指令碼中運行。當指令碼被匯入運行時,我們將其稱為模組(module)。模組是Python組織代碼的基本方式。

模組名與指令碼的檔案名稱相同,例如我們編寫了一個名為Items.py的指令碼,則可在另外一個指令碼中用import Items語句來匯入它。在匯入時,Python解譯器會先在指令碼目前的目錄下尋找,如果沒有則在sys.path包含的路徑中尋找。

在匯入模組時,Python會做以下三件事:
(1) 為模組檔案中定義的對象建立一個名字空間,通過這個名字空間可以訪問到模組中定義的函數及變數;
(2) 在新建立的名字空間裡執行模組檔案;
(3) 建立一個名為模組檔案的對象,該對象引用模組的名字空間,這樣就可以通過這個對象訪問模組中的函數及變數,如:

1 import sys
2  print sys.path

如果要同時匯入多個模組,可以用逗號分隔,如: import sys, os ;

可以使用as關鍵字來改變模組的引用對象名,如:import os as system ;

也可以用from語句將模組中的對象直接匯入到當前的名字空間(不建立模組名字空間的引用對象),如:from socket import gethostname ;

from語句支援逗號分割的對象,也可以使用星號(*)代表模組中除底線開頭的所有對象,如:from socket import *,這是個懶省事的方法,我是經常用,不過用之前最好先搞清楚會不會覆蓋當前名字空間中的函數名等,總之不是個好習慣:)

除了Python指令碼(不僅限於py,還包括pyc和pyo),import語句還可以匯入C或C++擴充(已編譯為共用庫或DLL檔案)、包(包含多個模組,一會介紹)和內建模組(使用C編寫並已連結到Python解譯器內)。不過除了包,另外兩個我也沒用過:(

Python解譯器在第一次import一個py檔案的時候,會嘗試將其編譯為位元組碼檔案,這個檔案的副檔名通常為.pyc,它是已經完成語法檢查並轉譯為虛擬機器指令的代碼。後邊的匯入操作會直接讀取.pyc檔案而不是.py檔案,一般而言速度會更快。

 

5.2  包

Python的模組可以按目錄組織為包(package)。一般來說,我們將多個關係密切的模組組織成一個包,以便於維護和使用,同時可有效避免名字空間衝突。建立一個包的步驟是:建立一個名字為包名字的檔案夾,並在該檔案夾下建立一個__init__.py檔案,你可以根據需要在該檔案夾下存放指令檔、已編譯擴充及子包。

一個典型的包可能有以下結構:

 1 package1/
2 __init__.py
3 subPack1/
4 __init__.py
5 module_11.py
6 module_12.py
7 module_13.py
8 subPack2/
9 __init__.py
10 module_21.py
11 module_22.py
12 ……

只要目錄下存在__init__.py,就表明此目錄應被作為一個package處理。在最簡單的例子中,__init__.py 是一個空檔案,不過一般我們都要在__init__.py中做一些包的初始化動作,或是設定一些變數。

最常用的變數是__all__。當使用包的人在用from pack import * 語句匯入的時候,系統會尋找目錄pack下的__init__.py檔案中的__all__這個變數。__all__是一個list,包含了所有應該被匯入的模組名稱,例如:__all__ = ["m1", "m2", "m3"] 表示當from pack import * 時會import 這三個module。

如果沒有定義__all__,from pack import * 不會保證所有的子模組被匯入。所以要麼通過__init.py__,要麼顯式地import 以保證子模組被匯入,如:import pack.m1,  pack.m2,  pack.m3。

 

5.3  本章小結

本章介紹了Python中模組與包的使用方法,要點如下:

(1) 模組是一個可以匯入的Python指令檔;
(2) 包是一堆按目錄組織的模組和子包,目錄下的__init__.py檔案存放了包的資訊;
(3) 可以用import, import as , form import 等語句匯入模組和包。

總之,模組與包是在物理上組織Python代碼複用的一種有效方式,它有點類似於C#中的程式集(Assembly)。初學Python不一定要會自己建立模組和包,但一定要學會使用各種包,這正是Python的強大之處:Python帶著各種各樣的battery。當你想完成一項功能時,最好先去搜尋是不是有相關的包能夠複用(多數情況下是這樣的,因為在各種領域都有太多的人在為Python作著貢獻)。而且,絕大多數Python包都是開源的,研讀優秀的代碼也是提高編程能力的一種有效途徑。

 

進一步閱讀的參考:

《從C#到Python》系列連載到今天就全部寫完了,非常感謝各位的支援、鼓勵以及批評,使我能夠不斷完善和提高。讀完這個連載,在Python的文法上應該夠應付一陣了,當然結合具體的應用領域,還是有很多東西需要不斷學習,在此向大家推薦一些有用的讀物:

[1] 科學計算方面:這個是我的應用程式Python的主陣地,推薦HYRY Studio的《用Python做科學計算》(見http://pyscin.appspot.com/html/index.html),我個人認為非常優秀的一本原創著作(這麼好的書不知為何不正式出版,欽佩作者的rp !)。

[2] GUI開發方面:如果你用wxPython,那麼肯定要看《wxPython in Action》(中文版見http://wiki.woodpecker.org.cn/moin/WxPythonInAction);而我個人主要用PyQt4,這方面值得推薦的讀物是柴樹杉翻譯的《PyQt4 編程簡介》(見http://pyqt-doc-cn.googlecode.com/svn/trunk/Introduction_to_PyQT4/doc/r54/index.html)。如果英文好,還是推薦看《Rapid GUI Programming with Python and Qt》(英文pdf版:http://householdcommandmodule.googlecode.com/files/Rapid.GUI.Programming.with.Python.and.Qt.Oct.2007.pdf)。

[3] Web開發方面:這個我還沒有涉及,Django的資料網上也是大把了,其它的Python Web開發架構也是多如牛毛,自己找找吧:)

[4] 移動開發方面:最近準備用PyS60做點小東西,不過一直抽不出時間來,下載了《PyS60 Library Reference》(中文版地址:http://www.woodpecker.org.cn:9081/doc/Python/_PDF/PythonForS60_1_4_1_CN_doc.pdf),一直沒時間看呢,所以不好推薦,不過官方的東西應該是差不了的。另外園子裡Lucker的blog上有一些關於PyS60開發的不錯文章,我雖收藏了,但也是一直沒時間詳細看,呵呵,以後再說了。

最後聲明:雖然寫的不咋地,不過好歹也是花了我很多時間和心血的,所以希望轉載的朋友請註明出處!

 

連載完

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.