Python 之模块重载的五种方法
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.mobiletrain.org/

相关推荐HOT
更多>>
python字符串和Java字符串
接下来,又到了Python字符串与Java字符串PK的时刻。Java中有比较字符串的方法,即compareTo()方法与equals()方法,前一个方法逐一比较两个字符...详情>>
2023-11-05 21:58:02
用Python开发一个简单的猜数字游戏
本文介绍如何使用Python制作一个简单的猜数字游戏。游戏规则玩家将猜测一个数字。如果猜测是正确的,玩家赢。如果不正确,程序会提示玩家所猜的...详情>>
2023-11-05 21:40:12
跟踪数据的Python技巧
了解如何运用Python的某些数据对象,有利于保持井然有序的状态,避免在处理数据科学项目中的大量数据时出错。在数据科学项目中,有时想跟踪数据...详情>>
2023-11-05 20:37:09
Python之描述符
Descriptors(描述符)是Python语言中一个深奥但很重要的一个黑魔法,它被广泛应用于Python语言的内核,熟练掌握描述符将会为Python程序员的工具...详情>>
2023-11-05 18:48:43