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多线程抓取天涯帖子内容示例
Apr 03 Python
python使用PythonMagick将jpg图片转换成ico图片的方法
Mar 26 Python
python在linux系统下获取系统内存使用情况的方法
May 11 Python
在Python的Django框架中获取单个对象数据的简单方法
Jul 17 Python
举例讲解Python中字典的合并值相加与异或对比
Jun 04 Python
利用python求相邻数的方法示例
Aug 18 Python
Anaconda下配置python+opencv+contribx的实例讲解
Aug 06 Python
Python 确定多项式拟合/回归的阶数实例
Dec 29 Python
Puppeteer使用示例详解
Jun 20 Python
Pytest如何使用skip跳过执行测试
Aug 13 Python
python 实现学生信息管理系统的示例
Nov 28 Python
python 实现端口扫描工具
Dec 18 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
缅甸的咖啡简史
2021/03/04 咖啡文化
PHP将XML转数组过程详解
2013/11/13 PHP
Laravel框架学习笔记(一)环境搭建
2014/10/15 PHP
PHP回溯法解决0-1背包问题实例分析
2015/03/23 PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
2016/09/14 PHP
php+redis消息队列实现抢购功能
2018/02/08 PHP
javascript 对表格的行和列都能加亮显示
2008/12/26 Javascript
远离JS灾难css灾难之 js私有函数和css选择器作为容器
2011/12/11 Javascript
JS图像无缝滚动脚本非常好用
2014/02/10 Javascript
js格式化时间小结
2014/11/03 Javascript
jquery利用拖拽方式在图片上添加热链接
2015/11/24 Javascript
js实现仿微博滚动显示信息的效果
2015/12/21 Javascript
jQuery基于cookie实现的购物车实例分析
2015/12/24 Javascript
JavaScript操作HTML DOM节点的基础教程
2016/03/11 Javascript
JS实现页面跳转参数不丢失的方法
2016/11/28 Javascript
Chrome浏览器的alert弹窗禁止再次弹出后恢复的方法
2016/12/30 Javascript
node.js中grunt和gulp的区别详解
2017/07/17 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(上)
2018/04/18 Javascript
ES6入门教程之Array.from()方法
2019/03/23 Javascript
layui 富文本编辑器和textarea值的相互传递方法
2019/09/18 Javascript
vue 关闭浏览器窗口的时候,清空localStorage的数据示例
2019/11/06 Javascript
详解Node.JS模块 process
2020/08/31 Javascript
原生JavaScript实现换肤
2021/02/19 Javascript
[49:08]Secret vs VP 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python处理XML格式数据的方法详解
2017/03/21 Python
python实现顺序表的简单代码
2018/09/28 Python
Python类和对象的定义与实际应用案例分析
2018/12/27 Python
对Pyhon实现静态变量全局变量的方法详解
2019/01/11 Python
pycharm 对代码做静态检查操作
2020/06/09 Python
python ssh 执行shell命令的示例
2020/09/29 Python
“四风”问题对照检查材料思想汇报
2014/09/16 职场文书
村干部任职承诺书
2015/01/21 职场文书
2016自主招生教师推荐信范文
2015/03/23 职场文书
公司员工离职感言
2015/08/03 职场文书
手把手教你从零开始react+antd搭建项目
2021/06/03 Javascript
 Redis 串行生成顺序编码的方法实现
2022/04/03 Redis