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实现计算资源图标crc值的方法
Oct 05 Python
浅谈Python爬取网页的编码处理
Nov 04 Python
Python中强大的命令行库click入门教程
Dec 26 Python
用pickle存储Python的原生对象方法
Apr 28 Python
python实现给微信公众号发送消息的方法
Jun 30 Python
Python数据结构之单链表详解
Sep 12 Python
python多进程实现进程间通信实例
Nov 24 Python
python爬虫中get和post方法介绍以及cookie作用
Feb 08 Python
python中栈的原理及实现方法示例
Nov 27 Python
Anaconda和ipython环境适配的实现
Apr 22 Python
python基于pexpect库自动获取日志信息
Feb 01 Python
Django+Nginx+uWSGI 定时任务的实现方法
Jan 22 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实现Ftp用户的在线管理的代码
2007/03/06 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
2011/08/22 PHP
PHP判断表单复选框选中状态完整例子
2014/06/24 PHP
对laravel in 查询的使用方法详解
2019/10/09 PHP
ExtJS 2.0实用简明教程 之ExtJS版的Hello
2009/04/29 Javascript
JavaScript Event学习第十章 一些可替换的事件对
2010/02/10 Javascript
初学Jquery插件制作 在SageCRM的查询屏幕隐藏部分行的功能
2011/12/26 Javascript
jQuery判断元素是否存在的可靠方法
2014/05/06 Javascript
jquery实现显示已选用户
2014/07/21 Javascript
javascript获取checkbox复选框获取选中的选项
2014/08/12 Javascript
jQuery晃动层特效实现方法
2015/03/09 Javascript
js实现键盘上下左右键选择文字并显示在文本框的方法
2015/05/07 Javascript
JQuery点击行tr实现checkBox选中的简单实例
2016/05/26 Javascript
jQuery实现的跨容器无缝拖动效果代码
2016/06/21 Javascript
javascript验证手机号和实现星号(*)代替实例
2016/08/16 Javascript
在网页中插入百度地图的步骤详解
2016/12/02 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
Angular 实现输入框中显示文章标签的实例代码
2018/11/07 Javascript
[01:14]DOTA2亚洲邀请赛小组赛赛前花絮
2017/03/27 DOTA
wxPython 入门教程
2008/10/07 Python
Django1.3添加app提示模块不存在的解决方法
2014/08/26 Python
在类Unix系统上开始Python3编程入门
2015/08/20 Python
浅谈Python生成器generator之next和send的运行流程(详解)
2017/05/08 Python
Python numpy生成矩阵、串联矩阵代码分享
2017/12/04 Python
对Python中画图时候的线类型详解
2019/07/07 Python
浅谈JupyterNotebook导出pdf解决中文的问题
2020/04/22 Python
django前端页面下拉选择框默认值设置方式
2020/08/09 Python
纯css3实现效果超级炫的checkbox复选框和radio单选框
2014/09/01 HTML / CSS
专升本自我鉴定
2013/10/10 职场文书
设计顾问服务计划书
2014/05/04 职场文书
学生手册评语
2014/05/05 职场文书
先进教师事迹材料
2014/12/16 职场文书
前台岗位职责范本
2015/04/16 职场文书
小时代观后感
2015/06/10 职场文书
《穷人》教学反思
2016/02/19 职场文书
党组织结对共建协议书
2016/03/23 职场文书