python 模块重载的五种方法


Posted in Python onApril 24, 2021

环境准备

新建一个 foo 文件夹,其下包含一个 bar.py 文件

$ tree foo
foo
└── bar.py

0 directories, 1 file

bar.py 的内容非常简单,只写了个 print 语句

print("successful to be imported")

只要 bar.py 被导入一次,就被执行一次 print

禁止重复导入

由于有 sys.modules 的存在,当你导入一个已导入的模块时,实际上是没有效果的。

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>

重载模块方法一

如果你使用的 python2(记得前面在 foo 文件夹下加一个 __init__.py),有一个 reload 的方法可以直接使用

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> reload(bar)
successful to be imported
<module 'foo.bar' from 'foo/bar.pyc'>

如果你使用的 python3 那方法就多了,详细请看下面

重载模块方法二

如果你使用 Python3.0 -> 3.3,那么可以使用 imp.reload 方法

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> import imp
>>> imp.reload(bar)
successful to be imported
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>

但是这个方法在 Python 3.4+,就不推荐使用了

<stdin>:1: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses

重载模块方法三

如果你使用的 Python 3.4+,请使用 importlib.reload 方法

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> import importlib
>>> importlib.reload(bar)
successful to be imported
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>

重载模块方法四

如果你对包的加载器有所了解

还可以使用下面的方法

>>> from foo import bar
successful to be imported
>>> from foo import bar
>>>
>>> bar.__spec__.loader.load_module()
successful to be imported
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>

重载模块方法五

既然影响我们重复导入的是 sys.modules,那我们只要将已导入的包从其中移除是不是就好了呢?

>>> import foo.bar
successful to be imported
>>>
>>> import foo.bar
>>>
>>> import sys
>>> sys.modules['foo.bar']
<module 'foo.bar' from '/Users/MING/Code/Python/foo/bar.py'>
>>> del sys.modules['foo.bar']
>>>
>>> import foo.bar
successful to be imported

有没有发现在前面的例子里我使用的都是 from foo import bar,在这个例子里,却使用 import foo.bar,这是为什么呢?

这是因为如果你使用 from foo import bar 这种方式,想使用移除 sys.modules 来重载模块这种方法是失效的。

这应该算是一个小坑,不知道的人,会掉入坑中爬不出来。

>>> import foo.bar
successful to be imported
>>>
>>> import foo.bar
>>>
>>> import sys
>>> del sys.modules['foo.bar']
>>> from foo import bar
>>>

以上就是python 模块重载的五种方法的详细内容,更多关于python 模块重载的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python实现将html表格转换成CSV文件的方法
Jun 28 Python
python对DICOM图像的读取方法详解
Jul 17 Python
python如何修改装饰器中参数
Mar 20 Python
对Python中的@classmethod用法详解
Apr 21 Python
python3+PyQt5泛型委托详解
Apr 24 Python
python 猴子补丁(monkey patch)
Jun 26 Python
对python中GUI,Label和Button的实例详解
Jun 27 Python
django框架单表操作之增删改实例分析
Dec 16 Python
pytorch 自定义卷积核进行卷积操作方式
Dec 30 Python
Python如何使用bokeh包和geojson数据绘制地图
Mar 21 Python
详解tensorflow2.x版本无法调用gpu的一种解决方法
May 25 Python
利用Python将list列表写入文件并读取的方法汇总
Mar 25 Python
写一个Python脚本自动爬取Bilibili小视频
python实现图片批量压缩
Apr 24 #Python
如何用python绘制雷达图
两行代码解决Jupyter Notebook中文不能显示的问题
python基础详解之if循环语句
Apr 24 #Python
解决jupyter notebook图片显示模糊和保存清晰图片的操作
Jupyter notebook 输出部分显示不全的解决方案
Apr 24 #Python
You might like
给初学PHP的5个入手程序
2006/11/23 PHP
解析php多线程下载远程多个文件
2013/06/25 PHP
PHP 数组基本操作方法详解
2016/06/17 PHP
PHP实现二维数组根据key进行排序的方法
2016/12/30 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
2020/05/25 PHP
JS自动适应的图片弹窗实例
2013/06/29 Javascript
js+css实现的简单易用兼容好的分页
2013/12/30 Javascript
js实现YouKu的漂亮搜索框效果
2015/08/19 Javascript
基于jQuery全屏焦点图左右切换插件responsiveslides
2015/09/07 Javascript
javascript实现五星评分功能
2015/11/10 Javascript
json对象转为字符串,当做参数传递时加密解密的实现方法
2016/06/29 Javascript
JS模拟实现方法重载示例
2016/08/03 Javascript
jquery easyUI中ajax异步校验用户名
2016/08/19 Javascript
实例分析浏览器中“JavaScript解析器”的工作原理
2016/12/12 Javascript
js实现点击每个li节点,都弹出其文本值及修改
2016/12/15 Javascript
vue2.0移除或更改的一些东西(移除index key)
2017/08/28 Javascript
JavaScript实现多张图片放大镜效果示例【不限定图片尺寸,rem单位】
2019/05/14 Javascript
扫微信小程序码实现网站登陆实现解析
2019/08/20 Javascript
微信小程序如何实现点击图片放大功能
2020/01/21 Javascript
详解JSON.stringify()的5个秘密特性
2020/05/26 Javascript
小程序自动化测试的示例代码
2020/08/11 Javascript
python实现比较类的两个instance(对象)是否相等的方法分析
2019/06/26 Python
Python中的上下文管理器相关知识详解
2019/09/19 Python
使用Python实现分别输出每个数组
2019/12/06 Python
Django视图、传参和forms验证操作
2020/07/15 Python
纯css3实现宠物小鸡实例代码
2018/10/08 HTML / CSS
canvas进阶之贝塞尔公式推导与物体跟随复杂曲线的轨迹运动
2018/01/10 HTML / CSS
联想德国官网:Lenovo Germany
2018/07/04 全球购物
Onzie官网:美国时尚瑜伽品牌
2019/08/21 全球购物
关联、聚合(Aggregation)以及组合(Composition)的区别
2012/02/29 面试题
介绍一下Make? 为什么使用make
2016/07/31 面试题
什么是servlet链?
2014/07/13 面试题
一名女生的自荐信
2013/12/08 职场文书
社会公德演讲稿
2014/05/20 职场文书
甜美蛋糕店的创业计划书模板,拿来即用!
2019/08/21 职场文书
Elasticsearch 批量操作
2022/04/19 Python