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 相关文章推荐
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
Jun 25 Python
python实现简单的TCP代理服务器
Oct 08 Python
浅析Python中的for 循环
Jun 09 Python
python简单操作excle的方法
Sep 12 Python
Python玩转Excel的读写改实例
Feb 22 Python
通过cmd进入python的实例操作
Jun 26 Python
如何利用Python模拟GitHub登录详解
Jul 15 Python
一篇文章搞定Python操作文件与目录
Aug 13 Python
Python数据可视化:饼状图的实例讲解
Dec 07 Python
Python virtualenv虚拟环境实现过程解析
Apr 18 Python
python实现画图工具
Aug 27 Python
Python insert() / append() 用法 Leetcode实战演示
Mar 31 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中文件读、写、删的操作(PHP中对文件和目录操作)
2012/03/06 PHP
基于php iconv函数的使用详解
2013/06/09 PHP
PHP数字字符串左侧补0、字符串填充和自动补齐的几种方法
2014/05/10 PHP
php中动态变量用法实例
2015/06/10 PHP
php使用escapeshellarg时中文被过滤的解决方法
2016/07/10 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
2019/02/25 PHP
jQuery+PHP实现图片上传并提交功能
2020/07/27 PHP
新闻内页-JS分页
2006/06/07 Javascript
js 学习笔记(三)
2009/12/29 Javascript
JavaScript 页面坐标相关知识整理
2010/01/09 Javascript
同一页面多个商品倒计时JS 基于面向对象的javascript
2012/02/16 Javascript
一个CSS+jQuery实现的放大缩小动画效果
2014/02/19 Javascript
jQuery 隐藏和显示 input 默认值示例
2014/06/03 Javascript
javascript的 {} 语句块详解
2016/02/27 Javascript
nodejs基础知识
2017/02/03 NodeJs
微信小程序 多行文本显示...+显示更多按钮和收起更多按钮功能
2019/09/26 Javascript
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
[04:15]DOTA2-DPC中国联赛 正赛 Ehome vs Aster 选手采访
2021/03/11 DOTA
Python中利用sqrt()方法进行平方根计算的教程
2015/05/15 Python
浅谈python为什么不需要三目运算符和switch
2016/06/17 Python
Python3 模块、包调用&路径详解
2017/10/25 Python
python 判断矩阵中每行非零个数的方法
2019/01/26 Python
Python微信操控itchat的方法
2019/05/31 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
python自动生成model文件过程详解
2019/11/02 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
2020/01/10 Python
Python如何生成xml文件
2020/06/04 Python
Python3读取和写入excel表格数据的示例代码
2020/06/09 Python
June Jacobs尊积帕官网:知名的spa水疗护肤品牌
2019/03/21 全球购物
Can a struct inherit from another struct? (结构体能继承结构体吗)
2016/09/25 面试题
同事打架检讨书
2014/02/04 职场文书
2014年单位植树节活动方案
2014/03/23 职场文书
药剂专业自荐信范文
2014/04/16 职场文书
新郎婚礼致辞
2015/07/27 职场文书
启动Tomcat时出现大量乱码的解决方法
2021/06/21 Java/Android
Golang实现可重入锁的示例代码
2022/05/25 Golang