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中的字符串类型基本知识学习教程
Feb 04 Python
Golang与python线程详解及简单实例
Apr 27 Python
python简单线程和协程学习心得(分享)
Jun 14 Python
Pandas探索之高性能函数eval和query解析
Oct 28 Python
Python xlwt设置excel单元格字体及格式
Apr 18 Python
python检测IP地址变化并触发事件
Dec 26 Python
python读取Excel表格文件的方法
Sep 02 Python
python创建子类的方法分析
Nov 28 Python
PyTorch之nn.ReLU与F.ReLU的区别介绍
Jun 27 Python
Python如何定义有可选参数的元类
Jul 31 Python
python反爬虫方法的优缺点分析
Nov 25 Python
Python Http请求json解析库用法解析
Nov 28 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开启gzip页面压缩实例
2013/06/09 PHP
yii实现创建验证码实例解析
2014/07/31 PHP
PHP数组相关函数汇总
2015/03/24 PHP
PHP实现批量修改文件后缀名的方法
2015/07/30 PHP
php blowfish加密解密算法
2016/07/02 PHP
thinkphp自带验证码全面解析
2016/09/18 PHP
PHP实现图片防盗链破解操作示例【解决图片防盗链问题/反向代理】
2020/05/29 PHP
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
jquery多选项卡效果实例代码(附效果图)
2013/03/23 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
2014/01/12 Javascript
jquery解析json格式数据的方法(对象、字符串)
2015/11/24 Javascript
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
2016/05/12 Javascript
浅谈Angular.js中使用$watch监听模型变化
2017/01/10 Javascript
Flask中获取小程序Request数据的两种方法
2017/05/12 Javascript
微信小程序实现跟随菜单效果和循环嵌套加载数据
2017/11/21 Javascript
基于vue 开发中出现警告问题去除方法
2018/01/25 Javascript
JS字符串去除连续或全部重复字符的实例
2018/03/08 Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
2019/06/13 Javascript
JavaScript数值类型知识汇总
2019/11/17 Javascript
微信小程序实现可长按移动控件
2020/11/01 Javascript
python文件的md5加密方法
2016/04/06 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
python定时利用QQ邮件发送天气预报的实例
2017/11/17 Python
Python中利用LSTM模型进行时间序列预测分析的实现
2019/07/26 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
2020/02/07 Python
Python matplotlib绘制图形实例(包括点,曲线,注释和箭头)
2020/04/17 Python
Python常用base64 md5 aes des crc32加密解密方法汇总
2020/11/06 Python
Html5 web本地存储实例详解
2016/07/28 HTML / CSS
欧洲、亚洲、非洲和拉丁美洲的度假套餐:Great Value Vacations
2019/03/30 全球购物
Python面试题:Python是如何进行内存管理的
2014/08/04 面试题
常务副总经理任命书
2014/06/05 职场文书
员工团队活动方案
2014/08/28 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
敬老院活动感想
2015/08/07 职场文书
如何解决springcloud feign 首次调用100%失败的问题
2021/06/23 Java/Android