Python中实现常量(Const)功能


Posted in Python onJanuary 28, 2015

python语言本身没有提供const,但实际开发中经常会遇到需要使用const的情形,由于语言本身没有这种支出,因此需要使用一些技巧来实现这一功能

定义const类如下

import sys
class Const(object):

    class ConstError(TypeException): pass

    def __setattr__(self, key, value):

        if self.__dict__.has_key(key):

            raise self.ConstError, "Changing const.%s" % key

        else:

            self.__dict__[key] = value
    def __getattr__(self, key):

        if self.__dict__.has_key(key):

            return self.key

        else:

            return None
sys.modules[__name__] = Const()

使用sys.modules[name]可以获取一个模块对象,并可以通过该对象获取模块的属性,这儿使用了sys.modules向系统字典中注入了一个Const对象从而实现了在执行import const时实际获取了一个Const实例的功能,sys.module在文档中的描述如下
sys.modules

This is a dictionary that maps module names to modules which have already been loaded. This can be manipulated to force reloading of modules and other tricks. Note that removing a module from this dictionary is not the same as calling reload() on the corresponding module object.

sys.modules[name] = Const()这条语句将系统已加载的模块列表中的const替换为了Const(),即一个Const实例

这样,整个工程需要使用的常量都应该定义在一个文件中,如下

from project.utils import const
const.MAIL_PROTO_IMAP = 'imap'

const.MAIL_PROTO_GMAIL = 'gmail'

const.MAIL_PROTO_HOTMAIL = 'hotmail'

const.MAIL_PROTO_EAS = 'eas'

const.MAIL_PROTO_EWS = 'ews'

这儿首先需要说明python中import module和from module import的区别

1.import module只是将module的name加入到目标文件的局部字典中,不需要对module进行解释
2.from module import xxx需要将module解释后加载至内存中,再将相应部分加入目标文件的局部字典中
3.python模块中的代码仅在首次被import时被执行一次

from project.utils import const时,发生了sys.modules[name] = Const(),此时const模块已经加载进入内存,系统字典中也已经有了Const对象,随后既可以使用Const实例了

在其他文件中需要使用常量值时,以如下方式调用

from project.apps.project_consts import const
print const.MAIL_PROTO_IMAP
Python 相关文章推荐
Python中input和raw_input的一点区别
Oct 21 Python
Python中操作文件之write()方法的使用教程
May 25 Python
12步教你理解Python装饰器
Feb 25 Python
python多维数组切片方法
Apr 13 Python
Python基于多线程实现ping扫描功能示例
Jul 23 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
Nov 06 Python
python获取当前文件路径以及父文件路径的方法
Jul 10 Python
PyTorch中Tensor的拼接与拆分的实现
Aug 18 Python
Python3 全自动更新已安装的模块实现
Jan 06 Python
Python DES加密实现原理及实例解析
Jul 17 Python
基于OpenCV的网络实时视频流传输的实现
Nov 15 Python
如何用六步教会你使用python爬虫爬取数据
Apr 06 Python
Python使用random和tertools模块解一些经典概率问题
Jan 28 #Python
Python中的异常处理学习笔记
Jan 28 #Python
Python中集合类型(set)学习小结
Jan 28 #Python
Python中使用装饰器和元编程实现结构体类实例
Jan 28 #Python
Python实现Const详解
Jan 27 #Python
python映射列表实例分析
Jan 26 #Python
Python操作MySQL简单实现方法
Jan 26 #Python
You might like
超神学院:鹤熙已踏入神圣领域,实力不比凯莎弱
2020/03/02 国漫
Php Image Resize图片大小调整的函数代码
2011/01/17 PHP
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
php中生成随机密码的自定义函数代码
2013/10/21 PHP
php+mysqli实现批量执行插入、更新及删除数据的方法
2015/01/29 PHP
详解php比较操作符的安全问题
2015/12/03 PHP
Symfony2使用第三方库Upload制作图片上传实例详解
2016/02/04 PHP
PHP通过CURL实现定时任务的图片抓取功能示例
2016/10/03 PHP
PHP快速推送微信模板消息
2017/04/14 PHP
使用PHPWord生成word文档的方法详解
2019/06/06 PHP
javascript 动态生成私有变量访问器
2009/12/06 Javascript
从js向Action传中文参数出现乱码问题的解决方法
2013/12/29 Javascript
JS 新增Cookie 取cookie值 删除cookie 举例详解
2014/10/10 Javascript
分享jQuery插件的学习笔记
2016/01/14 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
Javascript的表单验证-揭开正则表达式的面纱
2016/03/18 Javascript
基于JS实现发送短信验证码后的倒计时功能(无视页面刷新,页面关闭不进行倒计时功能)
2016/09/02 Javascript
vue中实现图片和文件上传的示例代码
2018/03/16 Javascript
Vue render深入开发讲解
2018/04/13 Javascript
vue实现在一个方法执行完后执行另一个方法的示例
2018/08/25 Javascript
阿望教你用vue写扫雷小游戏
2020/01/20 Javascript
Vue移动端用淘宝弹性布局lib-flexible插件做适配的方法
2020/05/26 Javascript
Python自动化测试ConfigParser模块读写配置文件
2016/08/15 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
通过shell+python实现企业微信预警
2019/03/07 Python
解决python中用matplotlib画多幅图时出现图形部分重叠的问题
2019/07/07 Python
python Pandas库基础分析之时间序列的处理详解
2019/07/13 Python
解决Atom安装Hydrogen无法运行python3的问题
2019/08/28 Python
html5 css3 动态气泡按钮实例演示
2012/12/02 HTML / CSS
CSS3 清除浮动的方法示例
2018/06/01 HTML / CSS
PHP如何设置和取得Cookie值
2015/06/30 面试题
党校学习心得体会范文
2014/09/09 职场文书
2015年新农合工作总结
2015/03/30 职场文书
三好学生竞选稿范文
2019/08/21 职场文书
MySQL 字符集 character
2022/05/04 MySQL
vue @ ~ 相对路径 路径别名设置方式
2022/06/05 Vue.js