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实现比较两个列表(list)范围
Jun 12 Python
Python中方法链的使用方法
Feb 23 Python
Python设计模式之职责链模式原理与用法实例分析
Jan 11 Python
Python 循环终止语句的三种方法小结
Jun 24 Python
kafka监控获取指定topic的消息总量示例
Dec 23 Python
关于Pytorch的MNIST数据集的预处理详解
Jan 10 Python
详解python内置常用高阶函数(列出了5个常用的)
Feb 21 Python
python列表切片和嵌套列表取值操作详解
Feb 27 Python
python同时遍历两个list用法说明
May 02 Python
python 实现分组求和与分组累加求和代码
May 18 Python
Python实现文件压缩和解压的示例代码
Aug 12 Python
Python使用socket模块实现简单tcp通信
Aug 18 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分钟前、昨天10:23等)
2011/10/03 PHP
php预定义变量使用帮助(带实例)
2013/10/30 PHP
php进行支付宝开发中return_url和notify_url的区别分析
2014/12/22 PHP
Laravel5权限管理方法详解
2016/07/26 PHP
JS IE和FF兼容性问题汇总
2009/02/09 Javascript
优化javascript的执行速度
2010/01/23 Javascript
javascript 星级评分效果(手写)
2012/12/24 Javascript
使用javascript过滤html的字符串(注释标记法)
2013/07/08 Javascript
PHP abstract与interface之间的区别
2013/11/11 Javascript
jQuery中:selected选择器用法实例
2015/01/04 Javascript
jQuery实现带有上下控制按钮的简单多行滚屏效果代码
2015/09/04 Javascript
JS组件Bootstrap Table布局详解
2016/05/27 Javascript
JavaScript判断是否是微信浏览器
2016/06/13 Javascript
js制作可以延时消失的菜单
2017/01/13 Javascript
JS组件系列之MVVM组件 vue 30分钟搞定前端增删改查
2017/04/28 Javascript
利用JS实现scroll自定义滚动效果详解
2017/10/17 Javascript
在VUE中实现文件下载并判断状态的方法
2019/11/08 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
只有 20 行的 JavaScript 模板引擎实例详解
2020/05/11 Javascript
jquery实现图片放大镜效果
2020/12/23 jQuery
[48:26]VGJ.S vs infamous Supermajor 败者组 BO3 第二场 6.4
2018/06/05 DOTA
python访问sqlserver示例
2014/02/10 Python
python获取本地计算机名字的方法
2015/04/29 Python
深入浅析python定时杀进程
2016/06/06 Python
读取本地json文件,解析json(实例讲解)
2017/12/06 Python
opencv python 基于KNN的手写体识别的实例
2018/08/03 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
2020/02/27 Python
英语文学专业学生的自我评价
2013/10/31 职场文书
小型女装店的创业计划书
2014/01/09 职场文书
员工安全承诺书
2014/05/22 职场文书
争先创优公开承诺书
2014/08/30 职场文书
2014光棍节大学生联谊活动方案
2014/10/10 职场文书
党的群众路线教育实践活动个人对照检查材料(校长)
2014/11/05 职场文书
2015年质检工作总结
2015/05/04 职场文书
美丽人生观后感
2015/06/03 职场文书
mysql函数之截取字符串的实现
2022/08/14 MySQL