python環(huán)境準(zhǔn)備
新建一個(gè)foo文件夾,其下包含一個(gè)bar.py文件:
$treefoo
foo
└──bar.py
0directories,1file
bar.py的內(nèi)容非常簡(jiǎn)單,只寫了個(gè)print語句:
print("successfultobeimported")
只要bar.py被導(dǎo)入一次,就被執(zhí)行一次print。
禁止重復(fù)導(dǎo)入由于有sys.modules的存在,當(dāng)你導(dǎo)入一個(gè)已導(dǎo)入的模塊時(shí),實(shí)際上是沒有效果的。
>>>fromfooimportbar
successfultobeimported
>>>fromfooimportbar
>>>
重載模塊方法一
如果你使用的python2(記得前面在foo文件夾下加一個(gè)__init__.py),有一個(gè)reload的方法可以直接使用:
>>>fromfooimportbar
successfultobeimported
>>>fromfooimportbar
>>>
>>>reload(bar)
successfultobeimported
如果你使用的python3那方法就多了,詳細(xì)請(qǐng)看下面。
重載模塊方法二
如果你使用Python3.0->3.3,那么可以使用imp.reload方法:
>>>fromfooimportbar
successfultobeimported
>>>fromfooimportbar
>>>
>>>importimp
>>>imp.reload(bar)
successfultobeimported
但是這個(gè)方法在Python3.4+,就不推薦使用了。
:1:DeprecationWarning:theimpmoduleisdeprecatedinfavourofimportlib;seethemodule'sdocumentationforalternativeuses
重載模塊方法三
如果你使用的Python3.4+,請(qǐng)使用importlib.reload方法:
>>>fromfooimportbar
successfultobeimported
>>>fromfooimportbar
>>>
>>>importimportlib
>>>importlib.reload(bar)
successfultobeimported
重載模塊方法四
如果你對(duì)包的加載器有所了解,還可以使用下面的方法:
>>>fromfooimportbar
successfultobeimported
>>>fromfooimportbar
>>>
>>>bar.__spec__.loader.load_module()
successfultobeimported
重載模塊方法五
既然影響我們重復(fù)導(dǎo)入的是sys.modules,那我們只要將已導(dǎo)入的包從其中移除是不是就好了呢?
>>>importfoo.bar
successfultobeimported
>>>
>>>importfoo.bar
>>>
>>>importsys
>>>sys.modules['foo.bar']
>>>delsys.modules['foo.bar']
>>>
>>>importfoo.bar
successfultobeimported
有沒有發(fā)現(xiàn)在前面的例子里我使用的都是fromfooimportbar,在這個(gè)例子里,卻使用importfoo.bar,這是為什么呢?
這是因?yàn)槿绻闶褂胒romfooimportbar這種方式,想使用移除sys.modules來重載模塊這種方法是失效的。
這應(yīng)該算是一個(gè)小坑,不知道的人,會(huì)掉入坑中爬不出來。
>>>importfoo.bar
successfultobeimported
>>>
>>>importfoo.bar
>>>
>>>importsys
>>>delsys.modules['foo.bar']
>>>fromfooimportbar
>>>
以上內(nèi)容為大家介紹了Python之模塊重載的五種方法,希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。http://m.2667701.com/