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