python如何重载模块实例解析


Posted in Python onJanuary 25, 2018

本文首先介绍了Python中的模块的概念,谈到了一个模块往往由多个模块组成,然后通过具体实例,分析了模块重载的相关内容,具体介绍如下。

模块是Python程序架构的一个核心概念,较大的程序往往以多个模块文件的形式呈现,一个模块被设计成主文件或顶层文件,用来启动整个Python程序。每个以.py为后缀的Python源代码文件都是一个模块,其他文件可通过“导入”读取这个模块的内容。从一般意义上讲,模块就是变量名的封装。如写一个模块test.py,包含一个两个变量名name、age。

name='Aidan' 
age=27

那么,通过在Python命令行中执行下述命令

import test 
print(test.name, test.age)

可以得到结果:Aidan 27

函数dir(modelname)可以用来获取模块内部可用的变量名,其中会包含一些Python内置的变量名如'__doc__、__file__'。
一个Python程序往往由多个模块组成,通过import连接。每个模块文件都是一个命名空间,看不到其他模块文件的变量名,除非通过import导入了那个文件或者通过from model import varible导入某个变量。这样就避免了变量命名的冲突,因为每个模块都是独立的命名空间,类似于C语言里一个个函数和其局部变量。

从本质上,“导入”就是在一个文件中载入另一个文件的内容,从而使另一个文件能够被放在外部世界使用,指令就是import name.py。导入只在每次会话的第一次执行有效果,后续再多次导入同一个文件时无效的,即使文件发生了更改,这是因为第一次导入时就将文件编译成了字节码。导入模块必须知道模块的详细路径(文件搜索,可通过sys.path中PYTHONPATH变量指明所有需要搜索的目录),因此为了简单,将所有需要导入的文件放在同一个目录。

若想在同一次会话中多次运行同一个文件(或文件发生改变、必须重载),那就需要调用“重载”函数-reload(name),调用reload函数前请确保已经通过import成功导入了该模块。看清“函数”reload()和“语句”import的区别,reload()是一个函数、参数就是已导入的文件模块文件名,import是一个语句、不需要括号。Python的重载功能允许用户在交互过程中编辑并改进代码模块,因此为了确保运行的是最新的代码,首先使用reload()。

flask 在调试时,如果我们对文件有所修改,服务器就会重新启动,而无需我们停下服务器再重新启动,这里面就暗藏了一个重载的机制。

下面用一个简单的例子,来解释python如何重载一个模块

新建一个名为reloadsetting.py 的文件,内容很简单:

#coding=utf-8 
''''' 
Created on 2016-3-25 
 
@author: Administrator 
''' 
 
msg = 'change it '

再新建一个名称为reloaddemo.py的文件,内容为:

#coding=utf-8 
''''' 
Created on 2016-3-25 
 
@author: Administrator 
''' 
import threading 
import reloadsetting 
import sys,os, time 
 
 
def printworker(): 
  while True: 
    time.sleep(1) 
    print reloadsetting.msg 
   
def auto_reload(): 
  while True: 
     
    mods = ["reloadsetting"] # the need reload modules 
    
    for mod in mods: 
      try: 
        module = sys.modules[mod] 
      except: 
        continue 
       
      #获得文件的名字 
      filename = module.__file__ 
       
      #pyc结尾的文件,只在第一次载入时生成,因此,即便我们对文件进行了修改,运行中,它的修改时间是不会变的 
      if filename.endswith(".pyc"): 
        filename = filename.replace(".pyc", ".py") 
      #获得文件上一次修改的时间 
      mod_time = os.path.getmtime(filename) 
      #module.__dict__ 里保存了模块的信息,具体参考globals函数 
      if not "loadtime" in module.__dict__: 
        module.loadtime = 0 # first load's time 1* 
      try: 
        #如果修改时间大于上一次载入的时间,那么就重新载入 
        if mod_time > module.loadtime: 
          reload(module) 
      except: 
        pass 
    
      module.loadtime = mod_time 
      time.sleep(1) 
if __name__ == '__main__': 
  t_reload = threading.Thread(target=auto_reload) 
  t_reload.start() 
   
  t_reload2 = threading.Thread(target=printworker) 
  t_reload2.start()

我们启动运行reloaddemo.py ,一个线程不停的打印reloadsetting模块中的msg,一个线程不停的尝试重载reloadsetting模块。在运行过程中,修改reloadsetting模块中的msg的内容,很快,打印出来的内容也会随之发生变化,你可能会担心,如果在修改时不慎写错了代码,比如把msg给删除掉了,或者写成了 msg = ,而后面根本就没有赋值,那重载岂不是就失败了么,这种担忧是多余的,即便模块reloadsetting中有错误,那么在调用reload函数时,也不会发生错误,模块仍然是上一次有效reload后的状态,不信,你可以试一试

总结

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

Python 相关文章推荐
Python制作数据导入导出工具
Jul 31 Python
python 遍历字符串(含汉字)实例详解
Apr 04 Python
Tornado高并发处理方法实例代码
Jan 15 Python
Python实现两个list求交集,并集,差集的方法示例
Aug 02 Python
在SQLite-Python中实现返回、查询中文字段的方法
Jul 17 Python
Django中Middleware中的函数详解
Jul 18 Python
Win10系统下安装labelme及json文件批量转化方法
Jul 30 Python
python+openCV调用摄像头拍摄和处理图片的实现
Aug 06 Python
Python socket 套接字实现通信详解
Aug 27 Python
Python面向对象原理与基础语法详解
Jan 02 Python
python 中关于pycharm选择运行环境的问题
Oct 31 Python
如何理解python接口自动化之logging日志模块
Jun 15 Python
Python进程间通信Queue实例解析
Jan 25 #Python
Python操作Redis之设置key的过期时间实例代码
Jan 25 #Python
python编程使用selenium模拟登陆淘宝实例代码
Jan 25 #Python
python画出三角形外接圆和内切圆的方法
Jan 25 #Python
Python实现批量压缩图片
Jan 25 #Python
python生成圆形图片的方法
Mar 25 #Python
scrapy spider的几种爬取方式实例代码
Jan 25 #Python
You might like
PHP7 新特性详细介绍
2016/09/06 PHP
Yii框架中sphinx索引配置方法解析
2016/10/18 PHP
PHP常用的类封装小结【4个工具类】
2019/06/28 PHP
JavaScript操作XML实例代码(获取新闻标题并分页,并分页)
2010/05/25 Javascript
通过一段代码简单说js中的this的使用
2013/07/23 Javascript
购物车选中得到价格实现示例
2014/01/26 Javascript
解析javascript瀑布流原理实现图片滚动加载
2016/03/10 Javascript
基于javascript实现图片切换效果
2016/04/17 Javascript
ES6下React组件的写法示例代码
2017/05/04 Javascript
详解bootstrap导航栏.nav与.navbar区别
2017/11/23 Javascript
浅析Node.js非对称加密方法
2018/01/29 Javascript
详解js的作用域、预解析机制
2018/02/05 Javascript
Vue循环组件加validate多表单验证的实例
2018/09/18 Javascript
解决eclipse中没有js代码提示的问题
2018/10/10 Javascript
详解 微信小程序开发框架(MINA)
2019/05/17 Javascript
JS字符串常用操作方法实例小结
2019/06/24 Javascript
vue 计算属性和侦听器的使用小结
2021/01/25 Vue.js
PYTHON正则表达式 re模块使用说明
2011/05/19 Python
python数据结构之二叉树的遍历实例
2014/04/29 Python
总结用Pdb库调试Python的方式及常用的命令
2016/08/18 Python
PyCharm设置护眼背景色的方法
2018/10/29 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
2019/01/09 Python
对Python中 \r, \n, \r\n的彻底理解
2020/03/06 Python
django 数据库 get_or_create函数返回值是tuple的问题
2020/05/15 Python
Python3内置函数chr和ord实现进制转换
2020/06/05 Python
plt.figure()参数使用详解及运行演示
2021/01/08 Python
AmazeUI 列表的实现示例
2020/08/17 HTML / CSS
匡威意大利官方商店 :Converse意大利
2018/11/27 全球购物
泰国最新活动和优惠:Megatix
2020/05/07 全球购物
企业演讲比赛主持词
2014/03/18 职场文书
质量承诺书怎么写
2014/05/24 职场文书
法人任命书范本
2014/06/04 职场文书
职工小家建设活动方案
2014/08/25 职场文书
客户答谢会致辞
2015/01/20 职场文书
老龙头导游词
2015/02/11 职场文书
董事长秘书岗位职责
2015/02/13 职场文书