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 selenium鼠标键盘操作(ActionChains)
Apr 12 Python
python用户管理系统的实例讲解
Dec 23 Python
Numpy中stack(),hstack(),vstack()函数用法介绍及实例
Jan 09 Python
Python操作MySQL模拟银行转账
Mar 12 Python
python 剪切移动文件的实现代码
Aug 02 Python
查看python安装路径及pip安装的包列表及路径
Apr 03 Python
基于Python批量生成指定尺寸缩略图代码实例
Nov 20 Python
python实现二分类的卡方分箱示例
Nov 22 Python
春节到了 教你使用python来抢票回家
Jan 06 Python
Python利用逻辑回归分类实现模板
Feb 15 Python
Python SMTP发送电子邮件的示例
Sep 23 Python
Python实现批量自动整理文件
Mar 16 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
Codeigniter(CI)框架分页函数及相关知识
2014/11/03 PHP
php格式化日期实例分析
2014/11/12 PHP
CentOS安装php v8js教程
2015/02/26 PHP
php实现贪吃蛇小游戏
2016/07/26 PHP
PHP实现重载的常用方法实例详解
2017/10/18 PHP
浅谈javascript 面向对象编程
2009/10/28 Javascript
url 特殊字符 传递参数解决方法
2010/01/01 Javascript
jquery中选择块并改变属性值的方法
2013/07/31 Javascript
js实现checkbox全选和反选示例
2014/05/01 Javascript
jquery中one()方法的用法实例
2015/01/16 Javascript
jQuery实现类似标签风格的导航菜单效果代码
2015/08/25 Javascript
SpringMVC框架下JQuery传递并解析Json格式的数据是如何实现的
2015/12/10 Javascript
jQuery获取及设置表单input各种类型值的方法小结
2016/05/24 Javascript
swiper插件自定义切换箭头按钮
2017/12/28 Javascript
微信小程序 select 下拉框组件功能
2019/09/09 Javascript
基于JavaScript实现单例模式
2019/10/30 Javascript
微信小程序如何获取地址
2019/12/24 Javascript
Python操作列表的常用方法分享
2014/02/13 Python
详解python中requirements.txt的一切
2017/03/03 Python
python字符串string的内置方法实例详解
2018/05/14 Python
Python字典创建 遍历 添加等实用基础操作技巧
2018/09/13 Python
Python中collections模块的基本使用教程
2018/12/07 Python
python numpy中cumsum的用法详解
2019/10/17 Python
Python实现企业微信机器人每天定时发消息实例
2020/02/25 Python
基于python实现判断字符串是否数字算法
2020/07/10 Python
python进度条显示之tqmd模块
2020/08/22 Python
python中pop()函数的语法与实例
2020/12/01 Python
Pycharm plot独立窗口显示的操作
2020/12/11 Python
你不知道的葡萄干处理法、橙蜜处理法、二氧化碳酵母法
2021/03/17 冲泡冲煮
英国男士时尚购物网站:Stuarts London
2017/10/22 全球购物
将世界上最美丽的摄影作品转化为艺术作品:Photos.com
2017/11/28 全球购物
意大利简约的休闲品牌:Aspesi
2018/02/08 全球购物
家长给幼儿园的表扬信
2014/01/09 职场文书
节能环保演讲稿
2014/08/28 职场文书
《静夜思》教学反思
2016/02/17 职场文书
解析:创业计划书和商业计划书二者之间到底有什么区别
2019/08/14 职场文书