Python之reload流程实例代码解析

本文研究的主要是Python之reload流程的相关内容,具体如下。

在Python中,reload() 用于重新载入之前载入的模块。

reload() 函数语法:

reload(module)

Python中 import 只执行一次,后续的 import 仅仅在 sys.modules 中查找是否存在对应的模块对象,而对于源文件进行修改后想要立即重新导入该文件而不想整体重新执行程序时, reload 就在该处派上用途了。在实际中,测试代码修改结果,或者对于不能停止的服务需要动态改变运行行为 reload 是非常有用的。

reload 的执行流程如下所示:

1)在 sys.modules 中查找到对应模块名的模块对象;

2)针对该模块名的 执行文件 属性,找到对应文件并重新编译该文件执行;

3)将代码执行中产生的对象依次更新到原模块对象的属性中;

从上面执行流程中我们可以看到如下几点:

1)模块对象是可变的,在 reload 执行过程中只是修改了该模块对象,因此在 reload 后原来的引用还是指向该模块对象;

2)reload 过程中,文件中代码重新执行,创建新的对象并绑定到模块的属性中;

3)reload 模块中的 import 和 reload 流程与该模块是否 reload 无关,一个模块 reload 并不会导致其中的 import 递归重新载入;

4)对于 from * import * 来说其相当于是在本地创建了同名的变量指向模块中的同名属性所引用对象, reload 会创建新对象(部分不可变对象除外),其仍然指向旧变量,一般情况下需要重新赋值;

基于此,测试如下代码:

#----- 被导入代码 reloadImported.py ------
print(' excute code in imported file')
x = []
y = 1 

#----- 测试代码 test.py --------
sep = ': '
print('---- import module ----')
import reloadImported
from reloadImported import x
print(' id(reloadImported)', id(reloadImported), sep=sep)
print(' id(reloadImported.x)', id(reloadImported.x), sep=sep)
print(' id(reloadImported.y)', id(reloadImported.y), sep=sep)
print(' id(x)', id(x), sep=sep) 

print('---- reload module ----')
from importlib import reload
reload(reloadImported)
print(' id(reloadImported)', id(reloadImported), sep=sep)
print(' id(reloadImported.x)', id(reloadImported.x), sep=sep)
print(' id(reloadImported.y)', id(reloadImported.y), sep=sep)
print(' id(x)', id(x), sep=sep)
from reloadImported import x
print(' new x id(x)', id(x), sep=sep) 

执行结果如下所示:

---- import module ----
 excute code in imported file
 id(reloadImported): 30322880
 id(reloadImported.x): 29841208
 id(reloadImported.y): 1502597584
 id(x): 29841208
---- reload module ----
 excute code in imported file
 id(reloadImported): 30322880
 id(reloadImported.x): 29842088
 id(reloadImported.y): 1502597584
 id(x): 29841208
 new x id(x): 29842088 

总结

以上就是本文关于Python之reload流程实例代码解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

您可能感兴趣的文章:

  • python中import reload __import__的区别详解
  • python中reload(module)的用法示例详解
(0)

相关推荐

  • python中import reload __import__的区别详解

    import 作用:导入/引入一个python标准模块,其中包括.py文件.带有__init__.py文件的目录(自定义模块). import module_name[,module1,...] from module import *|child[,child1,...] 注意:多次重复使用import语句时,不会重新加载被指定的模块,只是把对该模块的内存地址给引用到本地变量环境. 实例: pythontab.py #!/usr/bin/env python #encoding: utf-8

  • python中reload(module)的用法示例详解

    前言 本文主要给大家介绍了关于python中reload(module)用法的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 1.Python2中可以和Python3中关于reload()用法的区别. Python2 中可以直接使用reload(module)重载模块. Pyhton3中需要使用如下方式: (1) >>> from imp >>> imp.reload(module) (2) >>> from imp imp

  • Python之reload流程实例代码解析

    本文研究的主要是Python之reload流程的相关内容,具体如下. 在Python中,reload() 用于重新载入之前载入的模块. reload() 函数语法: reload(module) Python中 import 只执行一次,后续的 import 仅仅在 sys.modules 中查找是否存在对应的模块对象,而对于源文件进行修改后想要立即重新导入该文件而不想整体重新执行程序时, reload 就在该处派上用途了.在实际中,测试代码修改结果,或者对于不能停止的服务需要动态改变运行行为

  • Python request设置HTTPS代理代码解析

    之前版本的代理中,可以使用fiddler进行HTTP包的代理,但是代理HTTPS包时,执行错误 self._sslobj.do_handshake() ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749) urllib或requests在打开https站点是会验证证书,简单的处理方式就是把发送https请求时把验证ssl证书关掉,即设置verify为False 具体代码设置如:

  • python的re正则表达式实例代码

    本文研究的主要是python的re正则表达式的相关内容,具体如下. 概念:正则表达式(通项公式)是用来简洁表达一组字符串的表达式.优势是简洁,一行胜千言. 应用:字符串匹配. 实例代码: CODEC = 'UTF-8' #encoding:utf-8 import re p=re.compile("ab") str = "abfffa" #match必须匹配首字母 if p.match(str): print p.match(str).group() #match必

  • Python爬虫框架Scrapy实例代码

    目标任务:爬取腾讯社招信息,需要爬取的内容为:职位名称,职位的详情链接,职位类别,招聘人数,工作地点,发布时间. 一.创建Scrapy项目 scrapy startproject Tencent 命令执行后,会创建一个Tencent文件夹,结构如下 二.编写item文件,根据需要爬取的内容定义爬取字段 # -*- coding: utf-8 -*- import scrapy class TencentItem(scrapy.Item): # 职位名 positionname = scrapy.

  • AngularJs表单验证实例代码解析

    常用的表单验证指令如下详情: 1. 必填项验证 某个表单输入是否已填写,只要在输入字段元素上添加HTML5标记required即可: <input type="text" required /> 2. 最小长度 验证表单输入的文本长度是否大于某个最小值,在输入字段上使用指令ng-minleng= "{number}": <input type="text" ng-minlength="5" /> 3.

  • JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)

    最近做了个项目,其中有项目需求是要实现跑马灯抽奖效果,实现此功能主要用到js相关知识,废话不多说,感兴趣的朋友可以阅读下全文. 开始之前先来看上篇文章遗漏的两个问题和几个知识点,是自己重构的过程中需要用到的: 1.移动端1px像素线的问题 对于设计师给我的手机端网页的设计稿都是2倍图.按照道理来说,在写网页的时候,所有对象的实际尺寸都是会除2.但是对于1像素的线呢? 先来看两张图,设计稿的效果: 在三星 S4下的实际显示效果: 可以看到这个时候1px的线竟然显示不出来了.这个问题是跟 S4手机的

  • Android利用ZXing扫描二维码的实例代码解析

    相关阅读: Android开发框架之自定义ZXing二维码扫描界面并解决取景框拉伸问题 此项目源码地址:请点击这里 看一下zxing的项目结构,我这里直接拿过来用的 看一下扫码的activity: package com.fanyafeng.barcode.activity; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle

  • Java之Spring注解配置bean实例代码解析

    前面几篇均是使用xml配置bean,如果有上百个bean,这是不可想象的.故而,请使用注解配置bean !!! [1]注解类别 @Component : 基本注解, 标识了一个受 Spring(点击这里可以下载<Spring应用开发完全手册>) 管理的组件 @Repository : 标识持久层组件 @Service : 标识服务层(业务层)组件 @Controller : 标识表现层组件 Spring 能够从 classpath 下自动扫描, 侦测和实例化具有特定注解的组件. 对于扫描到的组

  • JavaScript实现跑马灯抽奖活动实例代码解析与优化(二)

    在上篇文章给大家介绍了JavaScript实现跑马灯抽奖活动实例代码解析与优化(一),既然是要编写插件.那么叫做"插件"的东西肯定是具有的某些特征能够满足我们平时开发的需求或者是提高我们的开发效率.那么叫做插件的东西应该具有哪些基本特征呢?让我们来总结一下: 1.JavaScript 插件一些基本特征: 配置一定要简单 插件中定义的变量不污染全局变量: 同一段代码可以在不同的地方复用: 用户可以自定义自己功能参数: 具有销毁变量和参数的功能: 如果按照以上的几个特征来写插件的话,我们可

  • Python ldap实现登录实例代码

    下面一段代码是小编给大家介绍的Python ldap实现登录实例代码,一起看看吧 ldap_config = { 'ldap_path': 'ldap://xx.xx.xx.xx:389', 'base_dn': 'ou=users,dc=ledo,dc=com', 'ldap_user': 'uid=reporttest,ou=users,dc=ledo,dc=com', 'ldap_pass': '111111.0', 'original_pass': '111111.0' } ldap_m

随机推荐