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去除列表中重复元素的方法
Mar 20 Python
简单实现Python爬取网络图片
Apr 01 Python
uwsgi+nginx部署Django项目操作示例
Dec 04 Python
Python3非对称加密算法RSA实例详解
Dec 06 Python
解析Python的缩进规则的使用
Jan 16 Python
python3人脸识别的两种方法
Apr 25 Python
python 随机森林算法及其优化详解
Jul 11 Python
python关于矩阵重复赋值覆盖问题的解决方法
Jul 19 Python
python爬虫 基于requests模块的get请求实现详解
Aug 20 Python
python中for循环变量作用域及用法详解
Nov 05 Python
python怎么判断模块安装完成
Jun 19 Python
Python必备技巧之函数的使用详解
Apr 04 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
对Session和Cookie的区分与解释
2007/03/16 PHP
php 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
PHP使用PDO抽象层获取查询结果的方法示例
2018/05/10 PHP
js每次Title显示不同的名言
2008/09/25 Javascript
基于jquery和svg实现超炫酷的动画特效
2014/12/09 Javascript
jQuery中innerWidth()方法用法实例
2015/01/19 Javascript
jQuery实现表格行上移下移和置顶的方法
2015/05/22 Javascript
基于javascript实现图片左右切换效果
2016/01/25 Javascript
深入理解jQuery 事件处理
2016/06/14 Javascript
JS实现兼容各种浏览器的获取选择文本的方法【测试可用】
2016/06/21 Javascript
深入浅析jQuery对象$.html
2016/08/22 Javascript
浅谈JavaScript 数据属性和访问器属性
2016/09/01 Javascript
node.js缺少mysql模块运行报错的解决方法
2016/11/13 Javascript
用vue2.0实现点击选中active其他选项互斥的效果
2018/04/12 Javascript
vue router导航守卫(router.beforeEach())的使用详解
2019/04/19 Javascript
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
2019/10/16 jQuery
Python Web框架Flask信号机制(signals)介绍
2015/01/01 Python
python使用三角迭代计算圆周率PI的方法
2015/03/20 Python
Python中内置数据类型list,tuple,dict,set的区别和用法
2015/12/14 Python
python获取当前运行函数名称的方法实例代码
2017/04/06 Python
对Python中Iterator和Iterable的区别详解
2018/10/18 Python
python pandas生成时间列表
2019/06/29 Python
python3使用print打印带颜色的字符串代码实例
2019/08/22 Python
python字典setdefault方法和get方法使用实例
2019/12/25 Python
Python实现数字的格式化输出
2020/08/01 Python
Pytho爬虫中Requests设置请求头Headers的方法
2020/09/22 Python
HTML5 Canvas自定义圆角矩形与虚线示例代码
2013/08/02 HTML / CSS
鼠标滚轮事件和Mac触控板双指事件
2019/12/23 HTML / CSS
阿迪达斯俄罗斯官方商城:adidas俄罗斯
2017/03/08 全球购物
专科毕业生学习生活的自我评价
2013/10/26 职场文书
社区七一党员活动方案
2014/01/25 职场文书
建议书怎么写
2014/03/12 职场文书
敬老模范事迹
2014/05/21 职场文书
个人综合鉴定材料
2014/05/23 职场文书
《葡萄沟》教学反思
2016/02/23 职场文书
彻底弄懂Python中的回调函数(callback)
2022/06/25 Python