您好,登錄后才能下訂單哦!
本文首先介紹了Python中的模塊的概念,談到了一個模塊往往由多個模塊組成,然后通過具體實(shí)例,分析了模塊重載的相關(guān)內(nèi)容,具體介紹如下。
模塊是Python程序架構(gòu)的一個核心概念,較大的程序往往以多個模塊文件的形式呈現(xiàn),一個模塊被設(shè)計成主文件或頂層文件,用來啟動整個Python程序。每個以.py為后綴的Python源代碼文件都是一個模塊,其他文件可通過“導(dǎo)入”讀取這個模塊的內(nèi)容。從一般意義上講,模塊就是變量名的封裝。如寫一個模塊test.py,包含一個兩個變量名name、age。
name='Aidan' age=27
那么,通過在Python命令行中執(zhí)行下述命令
import test print(test.name, test.age)
可以得到結(jié)果:Aidan 27
函數(shù)dir(modelname)可以用來獲取模塊內(nèi)部可用的變量名,其中會包含一些Python內(nèi)置的變量名如'__doc__、__file__'。
一個Python程序往往由多個模塊組成,通過import連接。每個模塊文件都是一個命名空間,看不到其他模塊文件的變量名,除非通過import導(dǎo)入了那個文件或者通過from model import varible
導(dǎo)入某個變量。這樣就避免了變量命名的沖突,因?yàn)槊總€模塊都是獨(dú)立的命名空間,類似于C語言里一個個函數(shù)和其局部變量。
從本質(zhì)上,“導(dǎo)入”就是在一個文件中載入另一個文件的內(nèi)容,從而使另一個文件能夠被放在外部世界使用,指令就是import name.py
。導(dǎo)入只在每次會話的第一次執(zhí)行有效果,后續(xù)再多次導(dǎo)入同一個文件時無效的,即使文件發(fā)生了更改,這是因?yàn)榈谝淮螌?dǎo)入時就將文件編譯成了字節(jié)碼。導(dǎo)入模塊必須知道模塊的詳細(xì)路徑(文件搜索,可通過sys.path中PYTHONPATH變量指明所有需要搜索的目錄),因此為了簡單,將所有需要導(dǎo)入的文件放在同一個目錄。
若想在同一次會話中多次運(yùn)行同一個文件(或文件發(fā)生改變、必須重載),那就需要調(diào)用“重載”函數(shù)-reload(name),調(diào)用reload函數(shù)前請確保已經(jīng)通過import成功導(dǎo)入了該模塊??辞濉昂瘮?shù)”reload()和“語句”import的區(qū)別,reload()是一個函數(shù)、參數(shù)就是已導(dǎo)入的文件模塊文件名,import是一個語句、不需要括號。Python的重載功能允許用戶在交互過程中編輯并改進(jìn)代碼模塊,因此為了確保運(yùn)行的是最新的代碼,首先使用reload()。
flask 在調(diào)試時,如果我們對文件有所修改,服務(wù)器就會重新啟動,而無需我們停下服務(wù)器再重新啟動,這里面就暗藏了一個重載的機(jī)制。
下面用一個簡單的例子,來解釋python如何重載一個模塊
新建一個名為reloadsetting.py 的文件,內(nèi)容很簡單:
#coding=utf-8 ''''' Created on 2016-3-25 @author: Administrator ''' msg = 'change it '
再新建一個名稱為reloaddemo.py的文件,內(nèi)容為:
#coding=utf-8 ''''' Created on 2016-3-25 @author: Administrator ''' import threading import reloadsetting import sys,os, time def printworker(): while True: time.sleep(1) print reloadsetting.msg def auto_reload(): while True: mods = ["reloadsetting"] # the need reload modules for mod in mods: try: module = sys.modules[mod] except: continue #獲得文件的名字 filename = module.__file__ #pyc結(jié)尾的文件,只在第一次載入時生成,因此,即便我們對文件進(jìn)行了修改,運(yùn)行中,它的修改時間是不會變的 if filename.endswith(".pyc"): filename = filename.replace(".pyc", ".py") #獲得文件上一次修改的時間 mod_time = os.path.getmtime(filename) #module.__dict__ 里保存了模塊的信息,具體參考globals函數(shù) if not "loadtime" in module.__dict__: module.loadtime = 0 # first load's time 1* try: #如果修改時間大于上一次載入的時間,那么就重新載入 if mod_time > module.loadtime: reload(module) except: pass module.loadtime = mod_time time.sleep(1) if __name__ == '__main__': t_reload = threading.Thread(target=auto_reload) t_reload.start() t_reload2 = threading.Thread(target=printworker) t_reload2.start()
我們啟動運(yùn)行reloaddemo.py ,一個線程不停的打印reloadsetting模塊中的msg,一個線程不停的嘗試重載reloadsetting模塊。在運(yùn)行過程中,修改reloadsetting模塊中的msg的內(nèi)容,很快,打印出來的內(nèi)容也會隨之發(fā)生變化,你可能會擔(dān)心,如果在修改時不慎寫錯了代碼,比如把msg給刪除掉了,或者寫成了 msg = ,而后面根本就沒有賦值,那重載豈不是就失敗了么,這種擔(dān)憂是多余的,即便模塊reloadsetting中有錯誤,那么在調(diào)用reload函數(shù)時,也不會發(fā)生錯誤,模塊仍然是上一次有效reload后的狀態(tài),不信,你可以試一試
總結(jié)
以上就是本文關(guān)于python如何重載模塊實(shí)例解析的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。