Python实现Const详解


Posted in Python onJanuary 27, 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的区别

import module只是将module的name加入到目标文件的局部字典中,不需要对module进行解释
from module import xxx需要将module解释后加载至内存中,再将相应部分加入目标文件的局部字典中
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用字典统计单词或汉字词个数示例
Apr 22 Python
Python使用Supervisor来管理进程的方法
May 28 Python
分享几道你可能遇到的python面试题
Jul 24 Python
TensorFlow实现AutoEncoder自编码器
Mar 09 Python
Python实现去除列表中重复元素的方法小结【4种方法】
Apr 27 Python
python 求某条线上特定x值或y值的点坐标方法
Jul 09 Python
python 矢量数据转栅格数据代码实例
Sep 30 Python
利用Python绘制Jazz网络图的例子
Nov 21 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
Mar 30 Python
在python里使用await关键字来等另外一个协程的实例
May 04 Python
python制作微博图片爬取工具
Jan 16 Python
python opencv实现图像配准与比较
Feb 09 Python
python映射列表实例分析
Jan 26 #Python
Python操作MySQL简单实现方法
Jan 26 #Python
Python中的is和id用法分析
Jan 26 #Python
Python的批量远程管理和部署工具Fabric用法实例
Jan 23 #Python
推荐11个实用Python库
Jan 23 #Python
17个Python小技巧分享
Jan 23 #Python
Windows8下安装Python的BeautifulSoup
Jan 22 #Python
You might like
随机广告显示(PHP函数)
2006/10/09 PHP
PHP压缩html网页代码(清除空格,换行符,制表符,注释标记)
2012/04/02 PHP
php无限极分类实现的两种解决方法
2013/04/28 PHP
PHPCMS V9 添加二级导航的思路详解
2016/10/20 PHP
Yii1.1框架实现PHP极光推送消息通知功能
2018/09/06 PHP
PHP实现微信申请退款功能
2018/10/01 PHP
用Div仿showModalDialog模式菜单的效果的代码
2007/03/05 Javascript
IE8提示Invalid procedure call or argument 异常的解决方法
2012/09/30 Javascript
nodejs分页类代码分享
2014/06/17 NodeJs
jQuery实现ichat在线客服插件
2014/12/29 Javascript
jQuery插件boxScroll实现图片轮播特效
2015/07/14 Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
2016/11/11 Javascript
JS中Select下拉列表类(支持输入模糊查询)功能
2017/01/17 Javascript
浅谈JavaScript正则表达式-非捕获性分组
2017/03/08 Javascript
JS全角与半角转化实例(分享)
2017/07/04 Javascript
基于vue实现一个神奇的动态按钮效果
2019/05/15 Javascript
小程序调用微信支付的方法
2019/09/26 Javascript
vue学习笔记之slot插槽用法实例分析
2020/02/29 Javascript
[01:01:42]Secret vs Optic Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
Python中文件遍历的两种方法
2014/06/16 Python
使用Python构建Hopfield网络的教程
2015/04/14 Python
python 通过logging写入日志到文件和控制台的实例
2018/04/28 Python
基于Django与ajax之间的json传输方法
2018/05/29 Python
python实现自动网页截图并裁剪图片
2018/07/30 Python
浅谈pytorch卷积核大小的设置对全连接神经元的影响
2020/01/10 Python
美国指甲油品牌:Deco Miami
2017/01/30 全球购物
39美元购买一副眼镜或太阳镜:39DollarGlasses.com
2018/06/17 全球购物
保护环境的建议书
2014/03/12 职场文书
周年庆促销方案
2014/03/15 职场文书
治庸问责心得体会
2014/09/12 职场文书
2014年文艺部工作总结
2014/11/17 职场文书
2014年管理人员工作总结
2014/12/01 职场文书
停车场管理制度范本
2015/08/05 职场文书
2019年预备党员的思想汇报:加深对党的认知
2019/09/25 职场文书
PyCharm 安装与使用配置教程(windows,mac通用)
2021/05/12 Python
Go timer如何调度
2021/06/09 Golang