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的Django框架中的数据过滤功能
Jul 17 Python
python、java等哪一门编程语言适合人工智能?
Nov 13 Python
python+matplotlib绘制旋转椭圆实例代码
Jan 12 Python
让代码变得更易维护的7个Python库
Oct 09 Python
Python中创建二维数组
Oct 17 Python
Python及Pycharm安装方法图文教程
Aug 05 Python
Python 实现opencv所使用的图片格式与 base64 转换
Jan 09 Python
使用python实现CGI环境搭建过程解析
Apr 28 Python
Pandas读取csv时如何设置列名
Jun 02 Python
基于python实现百度语音识别和图灵对话
Nov 02 Python
numba提升python运行速度的实例方法
Jan 25 Python
彻底解决pip下载pytorch慢的问题方法
Mar 01 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
Yii中srbac权限扩展模块工作原理与用法分析
2016/07/14 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
2017/02/10 PHP
PHP最常用的正则表达式
2017/02/13 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
2017/04/19 PHP
PHP精确到毫秒秒杀倒计时实例详解
2019/03/14 PHP
详解使用php-cs-fixer格式化代码
2020/09/16 PHP
仅用[]()+!等符号就足以实现几乎任意Javascript代码
2010/03/01 Javascript
基于jquery的一个图片hover的插件
2010/04/24 Javascript
IE6中链接A的href为javascript协议时不在当前页面跳转
2014/06/05 Javascript
JS输入用户名自动显示邮箱后缀列表的方法
2015/01/27 Javascript
移动设备web开发首选框架:zeptojs介绍
2015/01/29 Javascript
AngularJS中的$watch(),$digest()和$apply()区分
2016/04/04 Javascript
同步文本框内容JS代码实现
2016/08/04 Javascript
jQuery模拟实现天猫购物车动画效果实例代码
2017/05/25 jQuery
微信小程序之多列表的显示和隐藏功能【附源码】
2018/08/06 Javascript
p5.js绘制旋转的正方形
2019/10/23 Javascript
javascript实现滚动条效果
2020/03/24 Javascript
Jquery使用each函数实现遍历及数组处理
2020/07/14 jQuery
UEditor 自定义图片视频尺寸校验功能的实现代码
2020/10/20 Javascript
[51:07]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
在Python中操作列表之List.append()方法的使用
2015/05/20 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
2018/01/04 Python
python 获取一个值在某个区间的指定倍数的值方法
2018/11/12 Python
python样条插值的实现代码
2018/12/17 Python
通过Python编写一个简单登录功能过程解析
2019/09/04 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
2019/09/23 Python
利用Python代码实现一键抠背景功能
2019/12/29 Python
使用python接受tgam的脑波数据实例
2020/04/09 Python
python2和python3哪个使用率高
2020/06/23 Python
css3 按钮样式简单可扩展创建
2013/03/18 HTML / CSS
HTML5 Canvas概述
2009/08/26 HTML / CSS
小蚁科技官方商店:YI Technology
2019/08/23 全球购物
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
饭店工作计划书
2014/01/10 职场文书
办公用品管理制度
2015/08/04 职场文书
入党申请书怎么写?
2019/06/11 职场文书