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脚本来获取Google搜索结果的示例
May 04 Python
Python端口扫描简单程序
Nov 10 Python
解决uWSGI的编码问题详解
Mar 24 Python
Python操作Excel之xlsx文件
Mar 24 Python
Python实现调度算法代码详解
Dec 01 Python
网红编程语言Python将纳入高考你怎么看?
Jun 07 Python
python读取TXT每行,并存到LIST中的方法
Oct 26 Python
使用python将excel数据导入数据库过程详解
Aug 27 Python
django rest framework serializers序列化实例
May 13 Python
python代码区分大小写吗
Jun 17 Python
零基础小白多久能学会python
Jun 22 Python
怎么用Python识别手势数字
Jun 07 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全局使用Laravel辅助函数dd
2019/12/26 PHP
JQuery 图片的展开和伸缩实例讲解
2013/04/18 Javascript
js改变img标签的src属性在IE下没反应的解决方法
2013/07/23 Javascript
jquery中animate动画积累的解决方法
2013/10/05 Javascript
jQuery提示效果代码分享
2014/11/20 Javascript
JavaScript操作Cookie方法实例分析
2015/05/27 Javascript
Jquery简单实现GridView行高亮的方法
2015/06/15 Javascript
javascript中FOREACH数组方法使用示例
2016/03/01 Javascript
jquery点击切换背景色的简单实例
2016/08/25 Javascript
Angular2  NgModule 模块详解
2016/10/19 Javascript
Jquery Easyui进度条组件Progress使用详解(8)
2020/03/26 Javascript
详解Vue中添加过渡效果
2017/03/20 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
2017/07/11 Javascript
详解webpack进阶之loader篇
2017/08/23 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
2019/08/12 Javascript
Vue-cli3项目引入Typescript的实现方法
2019/10/18 Javascript
继承行为在 ES5 与 ES6 中的区别详解
2019/12/24 Javascript
vue.js this.$router.push获取不到params参数问题
2020/03/03 Javascript
Python对List中的元素排序的方法
2018/04/01 Python
Django处理文件上传File Uploads的实例
2018/05/28 Python
Linux 修改Python命令的方法示例
2018/12/03 Python
python tkinter实现界面切换的示例代码
2019/06/14 Python
Python3 Tkinter选择路径功能的实现方法
2019/06/14 Python
墨西哥网上购物:Linio墨西哥
2016/10/20 全球购物
MCM英国官网:奢侈皮具制品
2017/04/18 全球购物
盛大笔试题
2016/11/05 面试题
高三自我鉴定怎么写
2013/10/19 职场文书
体育学院毕业生自荐信
2013/11/03 职场文书
校本教研工作方案
2014/01/14 职场文书
舞蹈专业求职信
2014/06/13 职场文书
酒店端午节活动方案
2014/08/26 职场文书
最感人的道歉情书
2015/05/12 职场文书
公司管理制度范本
2015/08/03 职场文书
运动会广播稿100字
2015/08/19 职场文书
聘任协议书(挂靠)
2015/09/21 职场文书
2015质检员个人年终工作总结
2015/10/23 职场文书