Python新手如何理解循环加载模块


Posted in Python onMay 29, 2020

循环加载模块

假设你有两个文件,a.py和b.py,在这两个文件中互相加载对方,例如:

在a.py中:

import b
def f():
return b.x
print f()

在b.py中:

import a
x = 1
def g():
print a.f()

首先,我们试着加载a.py:

>>> import a
1

没有问题。也许让人吃惊,毕竟有个感觉应该是问题的循环加载在这儿。

事实上在Python中仅仅是表面上的出现循环加载并不是什么问题。如果一个模块以及被加载了,Python不会傻到再去重新加载一遍。但是,当每个模块都想要互相访问定义在对方里的函数或者变量时,问题就来了。

让我们再回到之前的例子,当我们加载a.py时,它再加载b.py不会有问题,因为在加载b.py时,它并不需要访问a.py的任何东西,而在b.py中唯一的引用就是调用a.f()。但是这个调用是在函数g()中完成的,并且a.py或者b.py中没有人调用g(),所以这会儿心情还是美丽的。

但是当我们试图加载b.py时(之前没有加载a.py),会发生什么呢:

>>> import b
Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "b.py", line 1, in <module>
  import a
   File "a.py", line 6, in <module>
  print f()
   File "a.py", line 4, in f
  return b.x
AttributeError: 'module' object has no attribute 'x'

恭喜你,出错了。这里问题出在加载b.py的过程中,Python试图加载a.py,并且在a.py中需要调用到f(),而函数f()又要访问到b.x,但是这个时候b.x却还没有被定义。这就产生了AttributeError异常。

解决的方案可以做一点细微的改动。改一下b.py,使得它在g()里面加载a.py:

x = 1
def g():
  import a  
# 只有当g()被调用的时候才加载
  print a.f()

这会儿当我们加载b.py的时候,一切安好:

>>> import b
>>> b.g()
1  
# 第一次输出,因为模块a在最后调用了‘print f()'
1  
# 第二次输出,这是我们调用g()

知识点扩充:

1、使用系统函数__import_()

stringmodule = __import__('string')

2、使用imp 模块

import imp
stringmodule = imp.load_module('string',*imp.find_module('string'))

3、使用exec

import_string = "import string as stringmodule"
exec import_string

到此这篇关于Python新手如何理解循环加载模块的文章就介绍到这了,更多相关Python循环加载模块详解内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python下载文件时显示下载进度的方法
Apr 02 Python
Python实现将doc转化pdf格式文档的方法
Jan 19 Python
pandas筛选某列出现编码错误的解决方法
Nov 07 Python
Django使用消息提示简单的弹出个对话框实例
Nov 15 Python
Python实现Wordcloud生成词云图的示例
Mar 30 Python
浅谈多卡服务器下隐藏部分 GPU 和 TensorFlow 的显存使用设置
Jun 30 Python
使用PyCharm安装pytest及requests的问题
Jul 31 Python
Python基于pyjnius库实现访问java类
Jul 31 Python
Python pathlib模块使用方法及实例解析
Oct 05 Python
python自动化发送邮件实例讲解
Jan 04 Python
关于探究python中sys.argv时遇到的问题详解
Feb 23 Python
Python pandas读取CSV文件的注意事项(适合新手)
Jun 20 Python
Python新手如何进行闭包时绑定变量操作
May 29 #Python
如何理解python中数字列表
May 29 #Python
Django实现前台上传并显示图片功能
May 29 #Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
May 29 #Python
Django实现后台上传并显示图片功能
May 29 #Python
Python分析微信好友性别比例和省份城市分布比例的方法示例【基于itchat模块】
May 29 #Python
Python基于smtplib模块发送邮件代码实例
May 29 #Python
You might like
PHP实现克鲁斯卡尔算法实例解析
2014/08/22 PHP
Zend Framework过滤器Zend_Filter用法详解
2016/12/09 PHP
php实现的读取CSV文件函数示例
2017/02/07 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
2017/08/11 PHP
php读取本地json文件的实例
2018/03/07 PHP
使用javascript获取flash加载的百分比的实现代码
2011/05/25 Javascript
document.getElementById介绍
2011/09/13 Javascript
jquery动态加载select下拉框示例代码
2013/12/10 Javascript
解析JSON对象与字符串之间的相互转换
2013/12/18 Javascript
javascript 实现map集合
2015/04/03 Javascript
三分钟带你玩转jQuery.noConflict()
2016/02/15 Javascript
jQuery控制文本框只能输入数字和字母及使用方法
2016/05/26 Javascript
bootstrap基础知识学习笔记
2016/11/02 Javascript
jQuery实现圣诞节礼物传送(花式轮播)
2016/12/25 Javascript
angularJS 指令封装回到顶部示例详解
2017/01/22 Javascript
用js制作淘宝放大镜效果
2020/10/28 Javascript
javascript事件的绑定基础实例讲解(34)
2017/02/14 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
Vue2递归组件实现树形菜单
2017/04/10 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
2017/05/12 Javascript
浅谈JS获取元素的N种方法及其动静态讨论
2017/08/25 Javascript
nodejs调取微信收货地址的方法
2017/12/20 NodeJs
vue-router权限控制(简单方式)
2018/10/29 Javascript
React中使用UMEditor的方法示例
2019/12/27 Javascript
socket + select 完成伪并发操作的实例
2017/08/15 Python
用 Python 连接 MySQL 的几种方式详解
2018/04/04 Python
python实现图片识别汽车功能
2018/11/30 Python
欧缇丽英国官方网站:Caudalie英国
2016/08/17 全球购物
英国领先的狗和宠物美容专家:Christies Direct
2017/04/03 全球购物
学校后勤人员职责
2013/12/27 职场文书
便利店促销方案
2014/02/20 职场文书
2016年元旦主持词
2015/07/06 职场文书
巾帼建功标兵先进事迹材料
2016/02/29 职场文书
MySQL 覆盖索引的优点
2021/05/19 MySQL
MySQL 重命名表的操作方法及注意事项
2021/05/21 MySQL
Python爬虫入门案例之爬取二手房源数据
2021/10/16 Python