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文件读写并使用mysql批量插入示例分享(python操作mysql)
Feb 17 Python
把MySQL表结构映射为Python中的对象的教程
Apr 07 Python
Python多线程编程简单介绍
Apr 13 Python
python自动zip压缩目录的方法
Jun 28 Python
解决python使用open打开文件中文乱码的问题
Dec 29 Python
shell命令行,一键创建 python 模板文件脚本方法
Mar 20 Python
Django中间件实现拦截器的方法
Jun 01 Python
Django处理多用户类型的方法介绍
May 18 Python
Python函数中参数是传递值还是引用详解
Jul 02 Python
react+django清除浏览器缓存的几种方法小结
Jul 17 Python
python wxpython 实现界面跳转功能
Dec 17 Python
Python爬虫之Selenium实现键盘事件
Dec 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查看session内容的函数
2008/08/27 PHP
Zend Framework页面缓存实例
2014/06/25 PHP
destoon实现商铺管理主页设置增加新菜单的方法
2014/06/26 PHP
ThinkPHP中order()使用方法详解
2016/04/19 PHP
PHP封装返回Ajax字符串和JSON数组的方法
2017/02/17 PHP
php 读取文件夹下所有图片、文件的实例
2018/10/17 PHP
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
2007/02/05 Javascript
Prototype1.6 JS 官方下载地址
2007/11/30 Javascript
一个实用的图片切换支持点击切换和自动轮播
2014/09/09 Javascript
javascript arguments使用示例
2014/12/16 Javascript
Javascript定义类(class)的三种方法详解
2015/03/13 Javascript
js+CSS实现模拟华丽的select控件下拉菜单效果
2015/09/01 Javascript
JavaScript登录记住密码操作(超简单代码)
2017/03/22 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
关于Vue在ie10下空白页的debug小结
2018/05/02 Javascript
Next.js项目实战踩坑指南(笔记)
2018/11/29 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
2018/12/29 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
JavaScript 异步时序问题
2020/11/20 Javascript
Python ORM框架SQLAlchemy学习笔记之关系映射实例
2014/06/10 Python
Python批量按比例缩小图片脚本分享
2015/05/21 Python
python ChainMap的使用和说明详解
2019/06/11 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
2020/03/14 Python
pycharm实现print输出保存到txt文件
2020/06/01 Python
Python OpenCV去除字母后面的杂线操作
2020/07/05 Python
python脚本定时发送邮件
2020/12/22 Python
CSS3实现自定义Checkbox特效实例代码
2017/04/24 HTML / CSS
使用html5 canvas 画时钟代码实例分享
2015/11/11 HTML / CSS
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
学校安全责任书
2014/04/14 职场文书
运动员获奖感言
2014/08/15 职场文书
给客户的感谢信
2015/01/21 职场文书
基层组织建设年活动总结
2015/05/09 职场文书
学雷锋广播稿大全
2015/08/19 职场文书
2016入党积极分子党课培训心得体会
2016/01/06 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书