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实现的登陆Discuz!论坛通用代码分享
Jul 11 Python
Python性能优化技巧
Mar 09 Python
在Python中操作列表之List.append()方法的使用
May 20 Python
Python实现的选择排序算法原理与用法实例分析
Nov 22 Python
Django 实现购物车功能的示例代码
Oct 08 Python
python字符串分割及字符串的一些常规方法
Jul 24 Python
Django集成celery发送异步邮件实例
Dec 17 Python
Python类反射机制使用实例解析
Dec 30 Python
tensorflow tf.train.batch之数据批量读取方式
Jan 20 Python
Python将二维列表list的数据输出(TXT,Excel)
Apr 23 Python
python pandas dataframe 去重函数的具体使用
Jul 20 Python
 python中的元类metaclass详情
May 30 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使用PHPMailer发送邮件的简单使用方法
2013/11/12 PHP
php数组查找函数in_array()、array_search()、array_key_exists()使用实例
2014/04/29 PHP
php提高网站效率的技巧
2015/09/29 PHP
PHP翻页跳转功能实现方法
2020/11/30 PHP
PHP实现的曲线统计图表示例
2016/11/10 PHP
PHP的PDO预处理语句与存储过程
2019/01/27 PHP
用js重建星际争霸
2006/12/22 Javascript
Kibo 用于处理键盘事件的Javascript工具库
2011/10/28 Javascript
javascript 基础篇3 类,回调函数,内置对象,事件处理
2012/03/14 Javascript
javascript中for/in循环及使用技巧
2015/09/01 Javascript
jquery+正则实现统一的表单验证
2015/09/20 Javascript
HTML中使背景图片自适应浏览器大小实例详解
2017/04/06 Javascript
vue封装第三方插件并发布到npm的方法
2017/09/25 Javascript
[56:35]DOTA2上海特级锦标赛主赛事日 - 5 总决赛Liquid VS Secret第一局
2016/03/06 DOTA
[56:01]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 Effect vs EG
2018/03/31 DOTA
轻松掌握python设计模式之策略模式
2016/11/18 Python
Python win32com 操作Exce的l简单方法(必看)
2017/05/25 Python
使用Python实现博客上进行自动翻页
2017/08/23 Python
Python定时器线程池原理详解
2020/02/26 Python
Python3 pickle对象串行化代码实例解析
2020/03/23 Python
CSS3教程(2):网页边框半径和网页圆角
2009/04/02 HTML / CSS
CSS3实现彩色进度条动画的示例
2020/10/29 HTML / CSS
HTML5+CSS3应用详解
2014/02/24 HTML / CSS
HTML5 Canvas玩转酷炫大波浪进度图效果实例(附demo)
2016/12/14 HTML / CSS
美国著名的品牌折扣店:Burlington
2017/06/08 全球购物
纽约通行卡:The New York Pass(免费游览纽约90多个景点)
2017/07/29 全球购物
便携式太阳能系统的创新者:GOAL ZERO
2018/02/04 全球购物
美国瑜伽服装和装备购物网站:Mukha Yoga
2019/02/22 全球购物
上海天奕面试题笔试题
2015/04/19 面试题
可口可乐广告词
2014/03/20 职场文书
团日活动总结范文
2014/04/25 职场文书
党建目标管理责任书
2014/07/25 职场文书
诉讼代理人授权委托书
2014/10/11 职场文书
大学生社会实践活动总结报告
2015/05/06 职场文书
HTML基础详解(上)
2021/10/16 HTML / CSS
如何利用python创作字符画
2022/06/25 Python