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 实现简单的 switch/case 语句的方法
Sep 17 Python
Python3爬虫学习之应对网站反爬虫机制的方法分析
Dec 12 Python
Python enumerate函数功能与用法示例
Mar 01 Python
Python实例方法、类方法、静态方法的区别与作用详解
Mar 25 Python
Python-Tkinter Text输入内容在界面显示的实例
Jul 12 Python
Django如何简单快速实现PUT、DELETE方法
Jul 24 Python
Python 使用list和tuple+条件判断详解
Jul 30 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
Oct 17 Python
Python3 实现爬取网站下所有URL方式
Jan 16 Python
使用python修改文件并立即写回到原始位置操作(inplace读写)
Jun 28 Python
Python进度条的使用
May 17 Python
python常见的占位符总结及用法
Jul 02 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
PHP MSSQL 存储过程的方法
2008/12/24 PHP
全新Mac配置PHP开发环境教程
2016/02/03 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
cssQuery()的下载与使用方法
2007/01/12 Javascript
jquery.simple.tree插件 更简单,兼容性更好的无限树插件
2010/09/03 Javascript
js 获取radio按钮值的实例
2013/08/17 Javascript
jquery实现在光标位置插入内容的方法
2015/02/05 Javascript
JS如何实现文本框随文本的长度而增长
2015/07/30 Javascript
javascript文本模板用法实例
2015/07/31 Javascript
JavaScript统计网站访问次数的实现代码
2015/11/18 Javascript
Javascript下拉刷新的简单实现
2017/02/14 Javascript
js从输入框读取内容,比较两个数字的大小方法
2017/03/13 Javascript
NodeJS实现微信公众号关注后自动回复功能
2017/05/31 NodeJs
JS库之Highlight.js的用法详解
2017/09/13 Javascript
angularjs 获取默认选中的单选按钮的value方法
2018/02/28 Javascript
Vue filter格式化时间戳时间成标准日期格式的方法
2018/09/16 Javascript
JavaScript数据结构与算法之二叉树添加/删除节点操作示例
2019/03/01 Javascript
基于ts的动态接口数据配置的详解
2019/12/18 Javascript
通过实例解析chrome如何在mac环境中安装vue-devtools插件
2020/07/10 Javascript
Vue中inheritAttrs的使用实例详解
2020/12/31 Vue.js
用python登录Dr.com思路以及代码分享
2014/06/25 Python
python uuid模块使用实例
2015/04/08 Python
对python list 遍历删除的正确方法详解
2018/06/29 Python
python的schedule定时任务模块二次封装方法
2019/02/19 Python
Django 导出项目依赖库到 requirements.txt过程解析
2019/08/23 Python
python urllib爬虫模块使用解析
2019/09/05 Python
Python Pillow.Image 图像保存和参数选择方式
2020/01/09 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
2020/02/27 Python
重写django的model下的objects模型管理器方式
2020/05/15 Python
英国健康和美容技术产品购物网站:CurrentBody
2019/07/17 全球购物
营销专业应届生求职信
2013/11/26 职场文书
乡镇干部先进事迹材料
2014/02/03 职场文书
铣床操作工岗位职责
2014/06/13 职场文书
团日活动总结报告
2014/06/25 职场文书
2015年酒店服务员工作总结
2015/05/18 职场文书
一篇带你入门Java垃圾回收器
2021/06/16 Java/Android