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 paramiko模块学习分享
Aug 23 Python
Python基于回溯法子集树模板解决找零问题示例
Sep 11 Python
django2 快速安装指南分享
Jan 05 Python
python负载均衡的简单实现方法
Feb 04 Python
python 3.6.2 安装配置方法图文教程
Sep 18 Python
Django model序列化为json的方法示例
Oct 16 Python
python 怎样将dataframe中的字符串日期转化为日期的方法
Sep 26 Python
浅析PEP570新语法: 只接受位置参数
Oct 15 Python
pygame实现俄罗斯方块游戏(AI篇1)
Oct 29 Python
python列表推导式入门学习解析
Dec 02 Python
Python基础之列表常见操作经典实例详解
Feb 26 Python
pytorch简介
Nov 11 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
操作Oracle的php类
2006/10/09 PHP
php判断是否为json格式的方法
2014/03/04 PHP
PHP5.5和之前的版本empty函数的不同之处
2014/06/13 PHP
解决更换PHP5.4以上版本后Dedecms后台登录空白问题的方法
2015/10/23 PHP
PHP使用GD库输出汉字的方法【测试可用】
2016/11/10 PHP
PHP实现微信模拟登陆并给用户发送消息的方法【文字,图片,图文】
2017/06/29 PHP
phpstudy隐藏index.php的方法
2020/09/21 PHP
javscript对象原型的一些看法
2010/09/19 Javascript
基于mootools 1.3框架下的图片滑动效果代码
2011/04/22 Javascript
js实现拖拽 闭包函数详细介绍
2012/11/25 Javascript
JS获取图片lowsrc属性的方法
2015/04/01 Javascript
jquery实现仿JqueryUi可拖动的DIV实例
2015/07/31 Javascript
深入理解JavaScript程序中内存泄漏
2016/03/17 Javascript
vue.js入门教程之计算属性
2016/09/01 Javascript
教你一步步用jQyery实现轮播器
2016/12/18 Javascript
JS获得多个同name 的input输入框的值的实现方法
2017/01/09 Javascript
详谈jQuery中使用attr(), prop(), val()获取value的异同
2017/04/25 jQuery
jQuery返回定位插件详解
2017/05/15 jQuery
Angular X中使用ngrx的方法详解(附源码)
2017/07/10 Javascript
js实现本地时间同步功能
2017/08/26 Javascript
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)
2019/05/10 Javascript
Vue路由管理器Vue-router的使用方法详解
2020/02/05 Javascript
python Pygame的具体使用讲解
2017/11/03 Python
Python闭包执行时值的传递方式实例分析
2018/06/04 Python
Python SVM(支持向量机)实现方法完整示例
2018/06/19 Python
python实现基于信息增益的决策树归纳
2018/12/18 Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
2020/03/30 Python
详解css3中的伪类before和after常见用法
2020/11/17 HTML / CSS
HTML5 Canvas自定义圆角矩形与虚线示例代码
2013/08/02 HTML / CSS
什么是三层交换,说说和路由的区别在那里
2014/09/01 面试题
Linux管理员面试经常问道的相关命令
2014/12/12 面试题
初中生学习生活的自我评价
2013/11/20 职场文书
创业融资计划书
2014/04/25 职场文书
竞选大队委员演讲稿
2014/04/28 职场文书
党员十八大心得体会
2014/09/12 职场文书
学校组织向国旗敬礼活动方案(中小学适用)
2014/09/27 职场文书