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 相关文章推荐
pyramid配置session的方法教程
Nov 27 Python
Tensorflow中的placeholder和feed_dict的使用
Jul 09 Python
Python基于多线程实现ping扫描功能示例
Jul 23 Python
python多任务及返回值的处理方法
Jan 22 Python
Python mutiprocessing多线程池pool操作示例
Jan 30 Python
python scatter散点图用循环分类法加图例
Mar 19 Python
Python的高阶函数用法实例分析
Apr 11 Python
Python音频操作工具PyAudio上手教程详解
Jun 26 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
Sep 18 Python
python中@property和property函数常见使用方法示例
Oct 21 Python
Python定义一个Actor任务
Jul 29 Python
Python爬虫过程解析之多线程获取小米应用商店数据
Nov 14 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
PHP在字符串中查找指定字符串并删除的代码
2008/10/02 PHP
浅谈PHP 闭包特性在实际应用中的问题
2009/10/30 PHP
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
2011/04/18 PHP
php根据地址获取百度地图经纬度的实例方法
2019/09/03 PHP
PHP防止sql注入小技巧之sql预处理原理与实现方法分析
2019/12/13 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
Javascript面象对象成员、共享成员变量实验
2010/11/19 Javascript
js监听输入框值的即时变化onpropertychange、oninput
2011/07/13 Javascript
浅析showModalDialog数据缓存问题(用禁止浏览器缓存解决)
2013/07/09 Javascript
javascript动态向网页中添加表格实现代码
2014/02/19 Javascript
jQuery简单图表peity.js使用示例
2014/05/02 Javascript
使用JavaScript进行进制转换将字符串转换为十进制
2014/09/21 Javascript
精通JavaScript的this关键字
2020/05/28 Javascript
AngularJS入门教程之AngularJS指令
2016/04/18 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
2016/06/06 Javascript
VUE使用vuex解决模块间传值问题的方法
2017/06/01 Javascript
详解React项目的服务端渲染改造(koa2+webpack3.11)
2018/03/19 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
2018/08/24 Javascript
vue中组件通信的八种方式(值得收藏!)
2019/08/09 Javascript
谈谈我在vue-cli3中用预渲染遇到的坑
2020/04/22 Javascript
js实现购物车商品数量加减
2020/09/21 Javascript
[13:18]《一刀刀一天》之DOTA全时刻21:详解TI新赛制 A队再露獠牙
2014/06/24 DOTA
[48:51]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第一场 11.28
2020/12/02 DOTA
[01:52]PWL S2开团时刻第四期——DOTA2成语故事
2020/12/03 DOTA
pycharm重命名文件的方法步骤
2019/07/29 Python
PyQt5多线程刷新界面防假死示例
2019/12/13 Python
Python中使用aiohttp模拟服务器出现错误问题及解决方法
2020/10/31 Python
俄罗斯Sportmarket体育在线商店:用于旅游和户外活动
2019/11/12 全球购物
慈善晚会策划方案
2014/05/14 职场文书
计划生育宣传标语
2014/06/21 职场文书
药剂专业毕业生求职信
2014/06/24 职场文书
银行党的群众路线教育实践活动对照检查材料
2014/09/25 职场文书
学校党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
地陪导游欢迎词
2015/01/26 职场文书
2016党员干部廉政准则学习心得体会
2016/01/20 职场文书
导游词之青岛崂山
2019/12/27 职场文书