《軟件編程思想-12》由會員分享,可在線閱讀,更多相關(guān)《軟件編程思想-12(26頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,*,單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,*,第,12,章 模塊,模塊概述,模塊,和文件,命名,空間,導(dǎo),入模塊,導(dǎo),入模塊屬性,模塊,內(nèi)建函數(shù)包,模塊,的其他特性,什么,是模塊,當(dāng),代碼量變得相當(dāng)大的時候,把,代碼分成,一些,有組織的代碼,段。這些,代碼片段相互間有一定的聯(lián)系,可能是一,個包含,數(shù)據(jù)成員和方法的類,也可能是一組相關(guān)但彼此獨立的操作函數(shù)。,這些,代碼段是共享的,,允許,調(diào)入,一個模塊,實現(xiàn),代碼重用,.,這個把其他模塊中屬性附加到你的模塊中的
2、操作叫做導(dǎo)入,(import),。那些自我包含并且有組織的,代碼,片斷就是模塊,(module),。,模塊,是按照邏輯來組織,Python,代碼的,方法;文件是,物理層上組織模塊的方法,。,模塊的文件名就是,模塊,的名字加上擴展名,.py,一個名稱空間就是一個從名稱到,對象的,關(guān)系映射集合,。,string,模塊中的,atoi(),函數(shù)就是,string.atoi(),。,通過句點屬性標(biāo)識指定了各自的名稱空間,-,防止了名稱沖突的發(fā)生。,搜索路徑和,路徑搜索,路徑搜索,:,指查找某個文件的操作,搜索路徑,:,去,查找一組目錄。,模塊的導(dǎo)入需要一個,叫做,“,路徑搜索,”,的,過程。即在,文件系
3、統(tǒng),“,預(yù)定,義,區(qū)域,”,中查找文件。,import xxx,Traceback(innermost last):,File,line 1,in?,ImportError:No module named xxx,默認搜索,路徑,sys.path,/usr/local/lib/python2.x/,/usr/local/lib/python2.x/plat-sunos5,/usr/local/lib/python2.x/lib-tk,/usr/local/lib/python2.x/lib-dynload,/,usr/local/lib/Python2.x/site-packages,sys.
4、path.append(/home/wesc/py/lib),名稱,空間,名稱空間是名稱,(,標(biāo)識符,),到對象的映射,。,向,名稱空間添加名稱的操作過程涉及到綁定標(biāo)識符,到指定,對象的操作,(,以及給該對象的引用計數(shù)加,1,),局部,名稱空間,全局名稱空間和內(nèi)建名稱,空間,名稱查找,確定作用域,覆蓋,名稱查詢,.,訪問一個,屬性時,解釋器必須在三個名稱空間中的一個找到它。首先從局部名稱空間開始,如果沒有找到,解釋器,將繼續(xù)查找全局名稱空間,.,如果這也失敗了,它將在內(nèi)建名稱空間里查找,。,foo,Traceback(innermost last):File,line 1,in?,NameEr
5、ror:foo,遮蔽效應(yīng)。,局部,名稱空間中找到的名字會隱藏,全局,或內(nèi)建名稱空間的對應(yīng)對象。這就相當(dāng)于,覆蓋,了那個全局變量。,遮蔽效應(yīng),def foo():,print ncalling foo().,bar=200,print in foo(),bar is,bar,bar=100,print in _main_,bar is,bar,foo,(),in,_main_,bar is 100,calling foo().,in foo(),bar is 200,無限制的名稱,空間,可以在任何需要放置數(shù)據(jù)的地方獲得一個名稱空間,。,def foo():,pass,foo._doc_=Oops
6、,forgot to add doc str above!,foo.version=0.2,導(dǎo)入,模塊,import,module1,import module2,import module1,module2,.moduleN,推薦,順序,:,Python,標(biāo)準(zhǔn)庫模塊,Python,第三方模塊,應(yīng)用程序自定義模塊,多行導(dǎo),入,從一個模塊導(dǎo)入許多屬性時,from,Tkinter import Tk,Frame,Button,Entry,Canvas,Text,LEFT,DISABLED,NORMAL,RIDGE,END,多行的,from-import,語句,from Tkinter import
7、 Tk,Frame,Button,Entry,Canvas,Text,from Tkinter import LEFT,DISABLED,NORMAL,RIDGE,END,擴展的,import,語句,(as,),:使用,自己想要的名字替換模塊的原始名稱,。,import longmodulename,short=longmodulename,del,longmodulename,from,cgi import FieldStorage,.,可以替換為,.,from,cgi import FieldStorage as form,模塊導(dǎo)入的,特性,載入時執(zhí)行,模塊:,加載模塊會導(dǎo)致這個模塊,被,
8、“,執(zhí)行,”,。也就是,被導(dǎo)入模塊的頂層代碼將直接被執(zhí)行,。包括,設(shè)定全局變量以及類和函數(shù)的聲明,。,導(dǎo)入,(import),和加載,(load,),:,一個模塊只被加載一次,無論它被導(dǎo)入多少次。這可以阻止多重導(dǎo)入時代碼被多次執(zhí)行。,導(dǎo)入到當(dāng)前名稱空間的,名稱,from-import,把名字導(dǎo)入當(dāng)前的名稱空間里去,不需要使用屬性,/,句點屬性,標(biāo)識來訪問模塊的標(biāo)識符。例如,模塊,module,中的,var,名字被,導(dǎo),入,:,from module import,var,限制使用,from module import*,被導(dǎo)入到導(dǎo)入者作用域的,名字,導(dǎo)致,覆蓋一,個已經(jīng)存在的具有相同名字的對象
9、。而且對這些變量的改變只影響它的局部拷貝而不是所導(dǎo)入,模塊的,原始名稱空間,。,#,imptee.py#,#,foo=abc,def show():,print foo from imptee:,foo,#,impter.py#,#,from imptee import foo,show,show(),foo=123,print foo from impter:,foo,show(),foo from imptee:abc,foo from impter:123,foo from imptee:abc,#,#impter.py#,#,import imptee,imptee.show(),im
10、ptee.foo=123,print foo from impter:,imptee.foo,imptee.show,(),foo from imptee:abc,foo from impter:123,foo from imptee:123,從,ZIP,文件中導(dǎo)入,模塊:,如果搜索,路徑中存在,一個,包含,Python,模塊的,.zip,文件,導(dǎo)入時會把,ZIP,文件當(dāng)作目錄,處理,在文件中搜索模塊,。,也可以為,.zip,文件加入特定的,(,子,),目錄,例如,/tmp/yolk.zip/lib,只會從,yolk,歸,檔的,lib/,子目錄下導(dǎo)入。,_import,_(),_import_
11、(module_name,globals,locals,fromlist,),module_name,變量是要導(dǎo)入模塊的名稱,globals,是包含當(dāng)前全局符號表的名字的字典,locals,是包含局部符號表的名字的字典,fromlist,是一個使用,from-import,語句所,導(dǎo)入符號,的列表。,sys=_import_(sys),def foo():,aString,=bar,anInt,=42,print,foo()s globals:,globals().keys(),print,foo()s locals:,locals().keys(),foo()s globals:_doc_,
12、foo,_name_,_builtins_,foo()s locals:anInt,aString,包:,一,個有層次的文件目錄結(jié)構(gòu),它定義了一個由模塊和子包組成的,Python,應(yīng)用程序,執(zhí)行環(huán)境,為平坦的名稱空間加入有層次的組織結(jié)構(gòu),允許程序員把有聯(lián)系的模塊組合到一起,允許分發(fā)者使用目錄結(jié)構(gòu)而不是一大堆混亂的文件,幫助解決有沖突的模塊名稱,包,目錄,結(jié)構(gòu),Phone/,_,init_.py,common_util.py,Mobile,/,_,init_.py,Analog.py,igital.py,import Phone.Mobile.Analog,Phone.Mobile.Analog
13、.dial(),絕對導(dǎo),入,import,Phone.Mobile.Analog,相對導(dǎo),入,from Phone.Mobile.Analog import dial,from.Analog import dial,mon_util import setup,from.Fax import G3.dial.,自動載入的模塊,sys.modules,變量包含一個由當(dāng)前載入,(,完整且成功導(dǎo)入,),到解釋器的模塊組成的字典,模塊名作,為鍵,它們的位置作為值,。,import sys,sys.modules.keys(),阻止屬性導(dǎo),入:,以給你不想導(dǎo)入的,屬性,名稱加上一個下劃線,(_),導(dǎo)入循環(huán),omh4cli.py,from cli4vof import cli4vof,def,cli_util():,pass,def,omh4cli():,cli4vof(),c,li4vof.py,import omh4cli,def cli4vof():,omh4cli.cli_util,(),def cli4vof():,import omh4cli,omh4cli.cli_util(),