




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第5章模塊和包標(biāo)題42目錄1.為什么使用模塊2.模塊的創(chuàng)建與使用3概述概述本章要解決的問題如下:什么是模塊為什么使用模塊如何使用模塊包以及實(shí)例41.為什么使用模塊1.1為什么使用模塊首先,提高了代碼的可維護(hù)其次,提高了代碼的可重用性最后,避免了函數(shù)名和變量名沖突51.為什么使用模塊1.2模塊角色從抽象的視角來看,模塊至少有三個(gè)角色
代碼的重用
系統(tǒng)命名空間的劃分
服務(wù)和數(shù)據(jù)的共享6目錄1.為什么使用模塊2.模塊的創(chuàng)建與使用3.包導(dǎo)入實(shí)例72.模塊的創(chuàng)建與使用2.1
Python程序架構(gòu)1.Python程序架構(gòu)實(shí)例圖82.模塊的創(chuàng)建與使用假設(shè)上圖中的文件b.py定義了一個(gè)名為spam的函數(shù),如下所示:defspam(text):print(text,'spam') 現(xiàn)在,假設(shè)a.py想要使用spam,為了實(shí)現(xiàn)這個(gè)目標(biāo),a.py中包含如下Python語句:importbb.spam('gumby')92.模塊的創(chuàng)建與使用2.1
Python程序架構(gòu)2.模塊程序和模塊:Python中,程序是作為一個(gè)主體的、頂層的文件來構(gòu)造的,配合零個(gè)或多個(gè)支持文件,這些支持文件都可以稱作模塊。頂層文件:包含了程序的主要的控制流程,即需要運(yùn)行來啟動(dòng)應(yīng)用的文件。102.1
Python程序架構(gòu)2.模塊模塊文件:可看作是工具的倉庫,這些倉庫是用來收集頂層文件(或其他可能的地方)使用的組件。頂層文件與模塊文件:頂層文件使用了在模塊文件中定義的工具,這些模塊文件也使用了其他模塊所定義的工具。2.模塊的創(chuàng)建與使用112.模塊的創(chuàng)建與使用2.1
Python程序架構(gòu)模塊的執(zhí)行環(huán)境:模塊包含變量、函數(shù)、類以及其他的模塊(如果導(dǎo)入的話),而函數(shù)也有自己的本地變量。右圖描述了模塊內(nèi)的情況以及與其他模塊的交互。模塊構(gòu)成及工作原理圖122.模塊的創(chuàng)建與使用2.1
Python程序架構(gòu)模塊間的關(guān)系:模塊可以被導(dǎo)入,但模塊也會(huì)導(dǎo)入和使用其他模塊,這些模塊可以用Python或其他語言寫成。132.模塊的創(chuàng)建與使用2.1
Python程序架構(gòu)3.模塊導(dǎo)入定義:一個(gè)文件可通過加載一個(gè)模塊(文件),從而讀取這個(gè)模塊(文件)的內(nèi)容,即導(dǎo)入。(1)模塊導(dǎo)入的三種方式importXfromXimport*fromXimporta,b,c142.1
Python程序架構(gòu)3.模塊導(dǎo)入(2)導(dǎo)入模塊時(shí),Python都做了哪些事情?152.模塊的創(chuàng)建與使用2.1
Python程序架構(gòu)3.模塊導(dǎo)入(3)導(dǎo)入模塊時(shí)的路徑搜索順序。①程序的主目錄:即程序(頂層)文件所在的目錄,而非啟動(dòng)程序所在的目錄(當(dāng)前工作目錄。②環(huán)境變量(PYTHONPATH)目錄。③標(biāo)準(zhǔn)鏈接庫目錄。④任何.pth文件的內(nèi)容(如果存在的話),在安裝目錄下找到該文件,以行的形式加入所需要的目錄即可。162.模塊的創(chuàng)建與使用2.2模塊搜索路徑172.模塊的創(chuàng)建與使用2.2模塊搜索路徑1.模塊搜索路徑sys.path的初始值來自于以下地方。包含腳本的當(dāng)前路徑。PYTHONPATH。默認(rèn)安裝路徑。編譯過的Python文件(.pyc文件)。built-in模塊。182.模塊的創(chuàng)建與使用2.2模塊搜索路徑2.配置搜索路徑方法一:添加環(huán)境變量PYTHONPATH。python會(huì)添加此路徑下的模塊,在.bashrc文件(這個(gè)文件主要保存一些個(gè)性化設(shè)置,如命令別名,路徑等)中添加如下類似行。exportPYTHONPATH=$PYTHONPATH:/usr/local/lib/python3.0/site-packages192.模塊的創(chuàng)建與使用2.2模塊搜索路徑方法二:在包內(nèi)添加。在site-packages添加一個(gè)路徑文件,如mypkpath.pth,必須以.pth為后綴,寫上你要加入的模塊文件所在的目錄名稱。①windowsc:\python3.0\site-packages②linux(ubuntu)/usr/local/lib/python3.0/dist-packages③linux(redhat)/usr/lib/python3.0/site-packages202.模塊的創(chuàng)建與使用2.2模塊搜索路徑方法三:函數(shù)添加。sys.path.append()函數(shù)添加搜索路徑,參數(shù)值即為要添加的路徑。①importsys②查看sys.path③添加sys.path.append("c:\\")212.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句1.import語句import導(dǎo)入為絕對(duì)導(dǎo)入。import只能導(dǎo)入模塊,不能導(dǎo)入模塊中的對(duì)象(類、函數(shù)、變量等)222.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句2.嵌套import(1)順序嵌套例如:本模塊導(dǎo)入A模塊(importA),A中又importB,B模塊還可以import其他模塊。232.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句2.嵌套import(2)循環(huán)嵌套,程序如下:#A.pyfromBimportDclassC:pass文件[B.py]fromAimportCclassD:pass為什么執(zhí)行A的時(shí)候不能加載D呢?242.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句如果將A.py改為:importB就可以了。這是怎么回事呢?這跟Python內(nèi)部import的機(jī)制是有關(guān)的,具體到fromBimportD,Python內(nèi)部會(huì)分成以下幾個(gè)步驟(具體如右圖所示)。252.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句這個(gè)例子的執(zhí)行順序如下(具體如右圖所示)。262.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句3.from語句因?yàn)閒rom會(huì)把變量名復(fù)制到另外一個(gè)作用域,所以它就可以直接在腳本中使用復(fù)制后的變量名,而不需要通過模塊(例如printer)。>>>frommodule1importprinter#復(fù)制一個(gè)變量>>>printer('Helloworld!')272.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句4.from*語句當(dāng)使用from*時(shí),會(huì)取得模塊頂層所有賦了值的變量名。在腳本中就可以直接使用得到的變量名printer,而不需要通過模塊名。>>>frommodule1import*#復(fù)制所有變量>>>print('Helloworld!')Helloworld!282.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句5.導(dǎo)入只發(fā)生一次模塊會(huì)在第一次import或from時(shí)載入并執(zhí)行,并且只在第一次如此。292.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句6.import和from是賦值語句(1)from將一個(gè)或多個(gè)變量名賦值給另一個(gè)模塊中同名的對(duì)象,例子如下:x=1y=[1,2]%python>>>fromsmallimportx,y #復(fù)制兩個(gè)變量>>>x=42 #修改x值>>>y[0]=42 #修改共享變量302.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句6.import和from是賦值語句(2)文件變量名的改變312.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句6.import和from是賦值語句(3)import和from的對(duì)等性像這樣的from語句:frommoduleimportname1,name2#復(fù)制兩個(gè)變量與下面這些語句是等效的:importmodule #獲取模塊對(duì)象name1=1 #賦值name2=2delmodule #刪除模塊名322.模塊的創(chuàng)建與使用2.3模塊導(dǎo)入語句7.from語句潛在的陷阱from語句會(huì)讓變量位置更隱秘和模糊,且從理論上講,from語句有破壞命名空間的“潛質(zhì)”。如果使用from導(dǎo)入變量,而那些變量碰巧和作用域中現(xiàn)有變量同名,變量就會(huì)被悄悄地覆蓋掉。另一方面,和reload調(diào)用同時(shí)使用時(shí),from語句有比較嚴(yán)重的問題,因?yàn)閷?dǎo)入的變量名可能引用之前版本的對(duì)象。332.模塊的創(chuàng)建與使用2.4模塊命名空間模塊最好理解為變量名的封裝,也就是定義想讓系統(tǒng)其余部分看見變量名的場(chǎng)所。簡而言之,模塊就是命名空間(變量名建立所在的場(chǎng)所),而存在于模塊之內(nèi)的變量名就是模塊對(duì)象的屬性。342.模塊的創(chuàng)建與使用2.4模塊命名空間1.文件生成命名空間模塊語句會(huì)在首次導(dǎo)入時(shí)執(zhí)行頂層的賦值語句會(huì)創(chuàng)建模塊屬性模塊的命名空間能通過屬性__dict__或dir(M)獲取352.模塊的創(chuàng)建與使用2.4模塊命名空間LEGB(用來規(guī)定命名空間查找順序的規(guī)則)含義解釋如下。L-Local(function):函數(shù)內(nèi)的名字空間。E-Enclosingfunctionlocals:外部嵌套函數(shù)的名字空間(例如closure)。G-Global(module):函數(shù)定義所在模塊(文件)的名字空間。B-Builtin(Python):Python內(nèi)置模塊的名字空間。362.模塊的創(chuàng)建與使用2.4模塊命名空間假設(shè)往文本編輯器中建立如下的模塊文件,并將其命名為module2.py。print('startingtoload...')importsysname=42deffunc(): pass #定義一個(gè)空函數(shù),pass是占位符classklass: pass #定義一個(gè)空類,pass是占位符print('doneloading.')執(zhí)行結(jié)果>>>importmodule2startingtoload...doneloading.372.模塊的創(chuàng)建與使用2.4模塊命名空間但是,一旦模塊加載后,它的作用域就變成模塊對(duì)象(由import取得)的屬性的命名空間,然后可以結(jié)合其模塊名,通過它來獲取命名空間內(nèi)的屬性。>>>module2.sys<module'sys'(built-in)>>>>42>>>module2.func<functionfuncatox026D3BBB>>>>module2.klass<class'module2.klass'>382.模塊的創(chuàng)建與使用2.4模塊命名空間2.屬性名的點(diǎn)號(hào)運(yùn)算點(diǎn)號(hào)運(yùn)算其實(shí)就是表達(dá)式,傳回和對(duì)象相配的屬性名的值,LEGB規(guī)則只適用于無點(diǎn)號(hào)運(yùn)算的純變量名。其規(guī)則如下:簡單變量點(diǎn)號(hào)運(yùn)算通用性。392.模塊的創(chuàng)建與使用2.4模塊命名空間3.導(dǎo)入和作用域無論程序中的導(dǎo)入結(jié)構(gòu)或函數(shù)調(diào)用的結(jié)構(gòu)是什么情況,變量的含義一定是由源代碼中的賦值語句的位置決定的,而屬性總是伴隨著對(duì)對(duì)象的請(qǐng)求。換句話說,導(dǎo)入操作不會(huì)賦予被導(dǎo)入文件中的代碼對(duì)上層代碼的可見度。被導(dǎo)入文件無法看見進(jìn)行導(dǎo)入的文件內(nèi)的變量名。402.模塊的創(chuàng)建與使用2.4模塊命名空間4.命名空間的嵌套雖然模塊導(dǎo)入不會(huì)使命名空間發(fā)生向上的嵌套,但會(huì)發(fā)生向下的嵌套。利用屬性的點(diǎn)號(hào)運(yùn)算路徑,有可能深入到任意嵌套的模塊中并讀取其屬性。412.模塊的創(chuàng)建與使用2.5
reload在python中,每一個(gè)以.py結(jié)尾的Python文件都是一個(gè)模塊,其他的文件可以通過導(dǎo)入一個(gè)模塊來讀取該模塊的內(nèi)容。默認(rèn)情況下,模塊在第一次被導(dǎo)入之后,其他的導(dǎo)入都不再有效。那么想要使得Python在同一次會(huì)話中再次運(yùn)行文件,就需要調(diào)用imp標(biāo)準(zhǔn)庫模塊中的reload函數(shù)。422.模塊的創(chuàng)建與使用2.5
reloadreload與import和from的不同之處如下。reload是Python*的內(nèi)置函數(shù),而不是語句。傳給reload的是已經(jīng)存在的模塊對(duì)象,而不是變量名。reload在Python3.0中位于模塊之中,并且必須導(dǎo)入自己。432.模塊的創(chuàng)建與使用2.5
reload此外,import語句和reload調(diào)用的語法并不相同,reload需要小括號(hào),但import不需要。重載如下所示:importmodule #初始導(dǎo)入usemodule.attributes #使用模塊fromimpimportreload#獲取重載函數(shù)reload(module) #重載模塊usemodule.attributes…442.模塊的創(chuàng)建與使用2.5
reload程序重載任何引用該模塊對(duì)象的地方,自動(dòng)會(huì)受到reload的影響,下面是一些細(xì)節(jié):reload會(huì)在模塊當(dāng)前命名空間內(nèi)執(zhí)行模塊文件的新代碼文件中頂層賦值語句會(huì)使得變量名換成新值重載會(huì)影響所有使用import讀取了模塊的客戶端重載只會(huì)對(duì)以后使用from的客戶端造成影響45目錄1.為什么使用模塊2.模塊的創(chuàng)建與使用3.包導(dǎo)入實(shí)例463.包導(dǎo)入實(shí)例包的組成Python的程序由包(package)、模塊(module)和函數(shù)組成。包是由一系列模塊組成的集合,模塊是處理某一類問題的函數(shù)和類的集合,它們之間的關(guān)系如右圖所示。473.包導(dǎo)入實(shí)例包與模塊的樹形圖
首先定義一個(gè)包parent,在parent包中創(chuàng)建兩個(gè)子包pack和pack2,pack包中定義一個(gè)模塊myModule,pack2包中定義一個(gè)模塊myModule2。最后在包parent中定義一個(gè)模塊main,調(diào)用子包pack和pack2,樹形圖如右圖所示。483.包導(dǎo)入實(shí)例包pack的__int__.py程序如下所示:if_name_=='_main_':print('作為主程序運(yùn)行')else:
print('pack初始化')
這段代碼初始化pack包,直接輸出一段字符串。當(dāng)pack包將其他模塊調(diào)用時(shí),將輸出“pack初始化”。493.包導(dǎo)入實(shí)例包pack的myModule模塊如下所示:deffunc():print("pack.myModule.func()")if_name_=='_main_':print('作為主程序運(yùn)行')else:
print('pack初始化')當(dāng)pack2包被其他模塊調(diào)用時(shí),先執(zhí)行__int__.py文件。503.包導(dǎo)入實(shí)例pack2包的__int__.py程序如下所示。if_name_=='_main_':p
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年標(biāo)準(zhǔn)自然人借款合同模板
- 2025簡化版房屋租賃合同
- 2025遼寧沈陽市渾南區(qū)森工林業(yè)集團(tuán)有限公司招聘56人筆試參考題庫附帶答案詳解
- 2025江蘇南通市崇川區(qū)潛慧恒馨企業(yè)發(fā)展有限公司招聘100人筆試參考題庫附帶答案詳解
- 2025山東祥泰商貿(mào)有限公司招聘7人筆試參考題庫附帶答案詳解
- 金融基金考試試題及答案
- 采茶勞務(wù)合同協(xié)議書范本
- 合同變更書面協(xié)議書
- 洗井合同協(xié)議書圖片
- 倉庫儲(chǔ)存合同協(xié)議書范本
- 湖南省天壹名校聯(lián)盟2025屆高三5月適應(yīng)性考試(化學(xué))
- 房地產(chǎn)廣告效果的評(píng)測(cè)與分析
- 2025年北京市石景山區(qū)九年級(jí)初三一模語文試卷(含答案)
- 華大新高考聯(lián)盟2025屆高三4月教學(xué)質(zhì)量測(cè)評(píng)歷史+答案
- T-CASEI 015-2023叉車使用安全管理規(guī)范
- 2025年浙江省溫州市中考一模語文試題(含答案)
- GB/T 12385-2025管法蘭用墊片密封性能試驗(yàn)方法
- 油煙機(jī)清洗合同協(xié)議范本
- 首次透析患者健康教育
- 山洪災(zāi)害防御知識(shí)課件
- 血吸蟲防急感課件
評(píng)論
0/150
提交評(píng)論