本文首先介绍了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如何重载模块实例解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
P70系列延期,华为新旗舰将在下月发布
3月20日消息,近期博主@数码闲聊站 透露,原定三月份发布的华为新旗舰P70系列延期发布,预计4月份上市。
而博主@定焦数码 爆料,华为的P70系列在定位上已经超过了Mate60,成为了重要的旗舰系列之一。它肩负着重返影像领域顶尖的使命。那么这次P70会带来哪些令人惊艳的创新呢?
根据目前爆料的消息来看,华为P70系列将推出三个版本,其中P70和P70 Pro采用了三角形的摄像头模组设计,而P70 Art则采用了与上一代P60 Art相似的不规则形状设计。这样的外观是否好看见仁见智,但辨识度绝对拉满。
更新日志
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]