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进程间通信用法实例
Jun 04 Python
网站渗透常用Python小脚本查询同ip网站
May 08 Python
Pycharm编辑器技巧之自动导入模块详解
Jul 18 Python
利用Python如何批量更新服务器文件
Jul 29 Python
WIn10+Anaconda环境下安装PyTorch(避坑指南)
Jan 30 Python
使用python和pygame制作挡板弹球游戏
Dec 03 Python
tensorflow实现二维平面模拟三维数据教程
Feb 11 Python
python3中的logging记录日志实现过程及封装成类的操作
May 12 Python
python中spy++的使用超详细教程
Jan 29 Python
判断Python中的Nonetype类型
May 25 Python
python调试工具Birdseye的使用教程
May 25 Python
python中Matplotlib绘制直线的实例代码
Jul 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
PHP网站安装程序制作的原理、步骤、注意事项和示例代码
2010/08/01 PHP
php实现上传图片生成缩略图示例
2014/04/13 PHP
微信支付开发教程(一)微信支付URL配置
2014/05/28 PHP
php使用curl获取https请求的方法
2015/02/11 PHP
ThinkPHP实现递归无级分类――代码少
2015/07/29 PHP
Javascript中的变量使用说明
2010/05/18 Javascript
css transform 3D幻灯片特效实现步骤解读
2013/03/27 Javascript
js获取IFRAME当前的URL的方法
2013/11/13 Javascript
js 高效去除数组重复元素示例代码
2013/12/19 Javascript
JS检测输入字符是否包含非法字符的示例代码
2014/02/11 Javascript
jquery列表拖动排列(由项目提取相当好用)
2014/06/17 Javascript
jQuery中animate动画第二次点击事件没反应
2015/05/07 Javascript
数据分析软件之FineReport教程:[5]参数界面JS(全)
2015/08/13 Javascript
JS+CSS实现的经典圆角下拉菜单效果代码
2015/10/21 Javascript
基于jQuery实现左侧菜单栏可折叠功能
2016/12/27 Javascript
详解如何在vue项目中引入elementUI组件
2018/02/11 Javascript
JavaScript实现异步图像上传功能
2018/07/12 Javascript
vue+mousemove实现鼠标拖动功能(拖动过快失效问题解决方法)
2018/08/24 Javascript
[02:00]DAC2018主宣传片——龙征四海,剑问东方
2018/03/20 DOTA
python随机生成指定长度密码的方法
2015/04/04 Python
Python读写unicode文件的方法
2015/07/10 Python
Python基于select实现的socket服务器
2016/04/13 Python
python去除字符串中的换行符
2017/10/11 Python
python获取当前目录路径和上级路径的实例
2018/04/26 Python
Python实现的网页截图功能【PyQt4与selenium组件】
2018/07/12 Python
计算机二级python学习教程(2) python语言基本语法元素
2019/05/16 Python
Python文件路径名的操作方法
2019/10/30 Python
使用 pytorch 创建神经网络拟合sin函数的实现
2020/02/24 Python
tensorflow常用函数API介绍
2020/04/19 Python
德国前卫设计师时装在线商店:Luxury Loft
2019/11/04 全球购物
全球领先的在线cosplay服装商店:RoleCosplay
2020/01/18 全球购物
迪卡侬(Decathlon)加拿大官网:源自法国的运动专业超市
2020/11/22 全球购物
高级工程师英文求职信
2014/03/19 职场文书
婚假请假条格式及范文
2014/04/10 职场文书
物业管理委托协议(2篇)
2014/09/23 职场文书
就业证明函
2015/06/17 职场文书