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开启多个子进程并行运行的方法
Apr 18 Python
Python探索之创建二叉树
Oct 25 Python
PyTorch线性回归和逻辑回归实战示例
May 22 Python
python递归全排列实现方法
Aug 18 Python
浅谈pycharm下找不到sqlalchemy的问题
Dec 03 Python
Python3解释器知识点总结
Feb 19 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
Jun 21 Python
在python中计算ssim的方法(与Matlab结果一致)
Dec 19 Python
Python restful框架接口开发实现
Apr 13 Python
Python3与fastdfs分布式文件系统如何实现交互
Jun 23 Python
Python unittest基本使用方法代码实例
Jun 29 Python
python识别验证码的思路及解决方案
Sep 13 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
磨咖啡豆的密诀
2021/03/03 冲泡冲煮
php之static静态属性与静态方法实例分析
2015/07/30 PHP
Joomla框架实现字符串截取的方法示例
2017/07/18 PHP
PHP实现微信对账单处理
2018/10/01 PHP
JavaScript也谈内存优化
2014/06/06 Javascript
深入浅析javascript立即执行函数
2015/10/23 Javascript
详解JavaScript的流程控制语句
2015/11/30 Javascript
ThinkJS中如何使用MongoDB的CURD操作
2016/12/13 Javascript
微信小程序实现多个按钮toggle功能的实例
2017/06/13 Javascript
Vue实现路由跳转和嵌套
2017/06/20 Javascript
Vue2.0如何发布项目实战
2017/07/27 Javascript
js 奇葩技巧之隐藏代码
2017/08/11 Javascript
javascript 缓冲运动框架的实现
2017/09/29 Javascript
React props和state属性的具体使用方法
2018/04/12 Javascript
深入了解JavaScript 私有化
2019/05/30 Javascript
JavaScript使用面向对象实现的拖拽功能详解
2019/06/12 Javascript
Vue+Koa2 打包后进行线上部署的教程详解
2019/07/31 Javascript
如何在Vue中抽离接口配置文件
2019/10/31 Javascript
vue表单验证之禁止input输入框输入空格
2020/12/03 Vue.js
[03:43]TI9战队采访——PSG.LGD
2019/08/22 DOTA
Python如何判断数独是否合法
2016/09/08 Python
Python退火算法在高次方程的应用
2018/07/26 Python
python3.6实现学生信息管理系统
2019/02/21 Python
PyQt5 QTableView设置某一列不可编辑的方法
2019/06/25 Python
Python实现银行账户资金交易管理系统
2020/01/03 Python
在脚本中单独使用django的ORM模型详解
2020/04/01 Python
Python如何获取文件路径/目录
2020/09/22 Python
Python中lru_cache的使用和实现详解
2021/01/25 Python
animation和transition的区别
2020/10/12 HTML / CSS
美国休闲服装品牌:J.Crew Factory
2017/03/04 全球购物
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
2015/11/18 面试题
AJAX应用和传统Web应用有什么不同
2013/08/24 面试题
应届毕业生应聘自荐信
2013/12/07 职场文书
公司董事长职责
2013/12/12 职场文书
高中毕业典礼演讲稿
2014/09/09 职场文书
基于JavaScript实现年月日三级联动
2021/06/22 Javascript