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