酷站(www.ku0.com)-致力于为互联网从业者提供动力!

热门关键词:  企业  as  baidu  c4rp3nt3r  美女
【ECS精选特惠】新用户上云低至1折起
百度资源

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

来源:互联网搜集 作者:秩名 人气: 发布时间:2020-05-29
本篇文章主要介绍了Python新手如何理解循环加载模块?,对大家的学习或者工作具有一定的参考学习价值,感兴趣的小伙伴们可以参考一下,也感谢大家对酷站(ku0.com)的支持。

循环加载模块

假设你有两个文件,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_()

?
1
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
 

版权声明:本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 959677720#qq.cn(#换@) 举报,一经查实,本站将立刻删除。
原文链接:https://www.py.cn/jishu/jichu/10532.html

相关文章

  • Python实现壁纸下载与轮换的教程

    Python实现壁纸下载与轮换的教程

    准备 下载安装Python3 官网下载即可,选择合适的版本:https://www.python.org/downloads/ 安装一直下一步即可,记得勾选添加到环境变量。 安装pypiwin32 执行设置壁纸操作需要调用Windows系统的API,需要安装pypiwin32,控制台执行如下......
    10-20
  • 教你如何快速自学python

    教你如何快速自学python

    一、作为初学者,应该如何学python? 很多人对python缩进试的简洁表达不以为然。那些都是已混迹于C和JAVA的老鸟已经习惯了花括号。对于初学者,python语言是最好写,最好读的。 二、追求生产力,应该学python python是全能语言,社区庞大......
    06-23
  • python的缩进规则的介绍

    python的缩进规则的介绍

    一般的语言都是通过{}或end来作为代码块的标记,而Python则是通过缩进来识别代码块的。 对于Python的这种缩进风格,喜欢它的人说这是一种乐趣;不喜欢它的人说这是一门需要卡尺的语言,因为需要使用游标卡尺去测量每行代码的缩进。 不管......
    06-23
  • python可以用哪些数据库?

    python可以用哪些数据库?

    数据库分类 早期数据库模型有三种,分别为层次式数据库、网络式数据库和关系型数据库。 而在当今的互联网中,通常把数据库分为两类,即关系型数据库和非关系型数据库。 关系型数据库 关系型数据库是指采用了关系模型来组织数据的数据库,......
    06-23
  • Django Admin上传文件到七牛云的教程

    Django Admin上传文件到七牛云的教程

    中文圈关于Django Admin 上传文件到七牛云的资料和函数库已经是2年前的了,国外的则都是关于AWS S3、Azure Storage一些国外的服务的。我根据Django的文档里提到的存储系统来实现上传文件到七牛云的简单功能。 在Django Admin的表单是根据......
    06-20
  • python中什么是面向对象?

    python中什么是面向对象?

    用面向对象的思维解决问题的重点 当遇到一个需求的时候不用自己去实现,如果自己一步步实现那就是面向过程;应该找一个专门做这个事的人来做。 面向对象(object-oriented ;简称: OO) 至今还没有统一的概念 我们可以把它定义为: 按人们 认......
    06-11
  • python实现凯撒密码、凯撒加解密算法的介绍

    python实现凯撒密码、凯撒加解密算法的介绍

    凯撒密码的原理:计算并输出偏移量为3的凯撒密码的结果 注意:密文是大写字母,在变换加密之前把明文字母都替换为大写字母 def casar(message):# *************begin************# message1=message.upper() #把明文字母变成大写 message......
    06-11
  • pyinstaller打包运行程序时出现缺少plotly库问题的介绍

    pyinstaller打包运行程序时出现缺少plotly库问题的介绍

    用pyinstaller打包tkinter程序,打包后运行exe是报如下错误: 搜索一阵发现是pyinstaller在打包的时候(StartRun.py我要打包的主程序文件)可能会漏掉一些三方库,就在打包的时候加上三方库的绝对路径: pyinstaller StartRun.py -F -p C:\......
    06-02
  • opencv-python的RGB与BGR互转方式的详解

    opencv-python的RGB与BGR互转方式的详解

    一、格式转换 opencv读取图片的默认像素排列是BGR,需要转换。PIL库是RGB格式。 caffe底层的图像处理是基于opencv,其使用的颜色通道顺序与也是BGR(Blue-Green-Red),而日常图片存储时颜色通道顺序是RGB。 在Python中,将RGB顺序的图像转......
    06-02
  • Python进行闭包时绑定变量操作的介绍

    Python进行闭包时绑定变量操作的介绍

    搞不清楚在闭包(closures)中Python是怎样绑定变量的 看这个例子: def create_multipliers():... return [lambda x : i * x for i in range(5)] for multiplier in create_multipliers():... print multiplier(2)... 期望得到下面的输......
    05-29

最新更新