一個模組可以在邏輯上組織Python代碼。將相關的代碼到一個模組中,使代碼更容易理解和使用。模組是可以綁定和借鑒任意命名屬性的Python對象。
簡單地說,一個模組是由Python代碼的檔案。一個模組可以定義函數,類和變數。模組還可以包括可啟動並執行代碼。
例子:
Python代碼的模組名為aname通常位於一個名為aname.py。下面是一個簡單的模組,support.py作為例子
def print_func( par ): print "Hello : ", par return
import語句:
可以通過在其他一些Python源檔案執行import語句來使用任何Python源檔案作為一個模組。import的文法如下:
import module1[, module2[,... moduleN]
當解譯器遇到import語句,它匯入(import)模組如果模組出現在搜尋路徑。搜尋路徑是一個目錄列表,該解譯器匯入模組之前搜尋。例如,匯入模組hello.py,需要把下面的命令在指令碼的頂部:
#!/usr/bin/python# Import module supportimport support# Now you can call defined function that module as followssupport.print_func("Zara")
當執行上面的代碼,產生以下結果:
Hello : Zara
一個模組被載入一次,不管匯入的次數。這可防止模組執行發生多次匯入。
from...import 語句
Python的from語句可以從一個模組中匯入特定的屬性到當前的命名空間。from...import 文法如下:
from modname import name1[, name2[, ... nameN]]
例如,從模組fib匯入函數fibonacci,使用下面的語句:
from fib import fibonacci
此語句不匯入整個模組fib到當前的命名空間;它只是介紹了fibonacci從模組fib匯入模組的全域符號表列。
from...import * 語句:
它也可以通過使用下面的import語句匯入從模組到當前的命名空間的所有名稱:
from modname import *
這提供了匯入從模組到當前的命名空間中的所有項目一個簡單的方法;不過,這個語句應謹慎使用。
定位模組:
當匯入一個模組,在下列序列模組由Python解譯器搜尋:
- 目前的目錄
- 如果未找到該模組,然後Python搜尋在shell變數PYTHONPATH每個目錄
- 如果這些方法都失敗,Python會檢查預設路徑。在UNIX上,預設路徑是正常是/usr/local/lib/python/
模組搜尋路徑被儲存在系統模組sys作為所述的sys.path變數。在sys.path的變數包含目前的目錄,PYTHONPATH和相關的預設安裝。
PYTHONPATH變數:
在PYTHONPATH是一個環境變數,包括目錄列表中。 PYTHONPATH的文法shell變數PATH相同。
下面是Windows系統的典型PYTHONPATH:
set PYTHONPATH=c:\python20\lib;
這裡是UNIX系統的典型PYTHONPATH:
set PYTHONPATH=/usr/local/lib/python
命名空間和範圍:
變數名稱(標識)映射到對象。名稱空間是變數名(鍵)及其相應的對象(的值)的字典。
Python語句可以在本地命名空間和全域命名空間訪問變數。如果局部和全域變數同名,局部變數屏蔽全域變數。
每個函數都有自己的命名空間。類方法遵循相同的範圍規則為普通函數。
Python對變數是否為局部或全域進行假定猜測。它假定任何變數賦值函數中的值是局部的。
因此為了使一個函數內的值賦給一個全域變數,必須先使用global語句。
聲明 global VarName 告訴Python VarName是一個全域變數。Python 停止尋找該變數的局部命名空間。
例如,我們在全域命名空間中定義的變數Money 。在該函數的Money ,我們給定Money 的值,因此Python 假定Money 為局部變數。但是,我們設定它,所以一個UnboundLocalError是結果之前訪問的局部變數Money 的值。取消global語句解決了這個問題。
#!/usr/bin/pythonMoney = 2000def AddMoney(): # Uncomment the following line to fix the code: # global Money Money = Money + 1print MoneyAddMoney()print Money
dir( ) 函數:
使用dir()內建函數返回一個包含一個模組中定義名稱的字串的排序列表。
該列表包含在一個模組中定義的所有模組,變數和函數的名稱。下面是一個簡單的例子:
#!/usr/bin/python# Import built-in module mathimport mathcontent = dir(math)print content;當執行上面的代碼,產生以下結果:['__doc__', '__file__', '__name__', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'cosh', 'degrees', 'e', 'exp', 'fabs', 'floor', 'fmod', 'frexp', 'hypot', 'ldexp', 'log','log10', 'modf', 'pi', 'pow', 'radians', 'sin', 'sinh', 'sqrt', 'tan', 'tanh']
在這裡,特殊字元串變數__name__是模組的名稱,__file__是從中載入的模組的檔案名稱。
globals()和 locals()函數:
globals() 和 locals() 函數可用於返回在根據在它們被稱為位置的全域和局部名稱空間的名稱。
如果locals()被一個函數中調用時,它會返回所有可以在局部從函數訪問的名稱。
如果globals()從一個函數中調用時,它會返回所有可以從全域函數進行訪問的名稱。
這兩個函數的傳回型別是字典。因此,名稱可以使用keys()函數提取出來。
reload()函數:
當該模組被匯入到一個指令碼,在一個模組的頂層部分的代碼只執行一次。
因此,如果你想重新執行的頂級代碼模組中,可以使用reload()函數。reload()函數匯入先前置入的模組了。reload()函數的文法是這樣的:
reload(module_name)
在這裡,module_name是要重裝,不包含模組名字串的模組的名稱。例如,要重新載入hello模組,請執行以下操作:
reload(hello)
Python中的包:
包是用於定義由模組和子包和子子包等的單一的Python應用環境的分層檔案目錄結構。
考慮一個檔案Pots.py在Phone目錄中可用。此檔案的原始碼如下一行:
#!/usr/bin/pythondef Pots(): print "I'm Pots Phone"
類似的方法,我們具有不同功能的另兩個檔案具有相同的名稱如上:
- Phone/Isdn.py檔案有函數 Isdn()
- Phone/G3.py 檔案有函數 G3()
現在,建立在Phone目錄中多了一個檔案__init__.py:
Phone/__init__.py
為了讓所有的功能可用,當匯入Phone,需要把__init__.py明確的import語句如下:
from Pots import Potsfrom Isdn import Isdnfrom G3 import G3
當添加完這些行到__init__.py,那麼已經匯入了Phone包所有這些類的使用。
#!/usr/bin/python# Now import your Phone Package.import PhonePhone.Pots()Phone.Isdn()Phone.G3()
當執行上面的代碼,產生以下結果:
I'm Pots PhoneI'm 3G PhoneI'm ISDN Phone
在上面的例子我們採取樣本每個檔案單個函數,但可以保留檔案中多個函數。還可以在這些檔案定義不同的Python類,可以在包外建立那些類。