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编写vim插件的简单示例
Apr 17 Python
在Python中使用HTMLParser解析HTML的教程
Apr 29 Python
Python原始字符串与Unicode字符串操作符用法实例分析
Jul 22 Python
python实现在图片上画特定大小角度矩形框
Oct 24 Python
Django实现一对多表模型的跨表查询方法
Dec 18 Python
Python基于BeautifulSoup和requests实现的爬虫功能示例
Aug 02 Python
Python K最近邻从原理到实现的方法
Aug 15 Python
对pytorch的函数中的group参数的作用介绍
Feb 18 Python
Python如何使用PIL Image制作GIF图片
May 16 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
Jun 15 Python
python利用proxybroker构建爬虫免费IP代理池的实现
Feb 21 Python
python 离散点图画法的实现
Apr 01 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 杂谈《重构-改善既有代码的设计》之三 重新组织数据
2012/04/09 PHP
php像数组一样存取和修改字符串字符
2014/03/21 PHP
php使用递归函数实现数字累加的方法
2015/03/16 PHP
PHP MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
2017/10/19 PHP
使用JavaScript动态设置样式实现代码(2)
2013/01/25 Javascript
JavaScript中如何通过arguments对象实现对象的重载
2014/05/12 Javascript
jQueryMobile之Helloworld与页面切换的方法
2015/02/04 Javascript
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
js图片放大镜效果实现方法详解
2020/10/28 Javascript
Vue仿手机qq的实例代码(demo)
2017/09/08 Javascript
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
Vue.js实现可排序的表格组件功能示例
2019/02/19 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
Vue最新防抖方案(必看篇)
2019/10/30 Javascript
[02:49]DAC2018决赛日TOP5 LGD开启黑暗之门绝杀VP
2018/04/08 DOTA
用Python实现协同过滤的教程
2015/04/08 Python
给Python的Django框架下搭建的BLOG添加RSS功能的教程
2015/04/08 Python
Python编程修改MP3文件名称的方法
2017/04/19 Python
python实现嵌套列表平铺的两种方法
2018/11/08 Python
python3实现二叉树的遍历与递归算法解析(小结)
2019/07/03 Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
2019/08/07 Python
快速解决docker-py api版本不兼容的问题
2019/08/30 Python
python实现udp聊天窗口
2020/03/31 Python
怎样声明接口
2014/09/19 面试题
中文专业毕业生自荐书范文
2014/01/04 职场文书
优秀经理获奖感言
2014/03/04 职场文书
2014年重阳节敬老活动方案
2014/09/16 职场文书
车队安全员岗位职责
2015/02/15 职场文书
预备党员半年考察意见
2015/06/01 职场文书
2016年基层党组织公开承诺书
2016/03/25 职场文书
python基于scrapy爬取京东笔记本电脑数据并进行简单处理和分析
2021/04/14 Python
postgresql使用filter进行多维度聚合的解决方法
2021/07/16 PostgreSQL
django 认证类配置实现
2021/11/11 Python
如何解决php-fpm启动不了问题
2021/11/17 PHP