Python实现Const详解


Posted in Python onJanuary 27, 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的区别

import module只是将module的name加入到目标文件的局部字典中,不需要对module进行解释
from module import xxx需要将module解释后加载至内存中,再将相应部分加入目标文件的局部字典中
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实现得到一个给定类的虚函数
Sep 28 Python
Python二维码生成库qrcode安装和使用示例
Dec 16 Python
python中实现迭代器(iterator)的方法示例
Jan 19 Python
Python常见字符串操作函数小结【split()、join()、strip()】
Feb 02 Python
python实现word 2007文档转换为pdf文件
Mar 15 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
Mar 30 Python
python django中8000端口被占用的解决
Dec 17 Python
Django日志及中间件模块应用案例
Sep 10 Python
Python字符串三种格式化输出
Sep 17 Python
Django filter动态过滤与排序实现过程解析
Nov 26 Python
PyQt5 QThread倒计时功能的实现代码
Apr 02 Python
python字符串拼接.join()和拆分.split()详解
Nov 23 Python
python映射列表实例分析
Jan 26 #Python
Python操作MySQL简单实现方法
Jan 26 #Python
Python中的is和id用法分析
Jan 26 #Python
Python的批量远程管理和部署工具Fabric用法实例
Jan 23 #Python
推荐11个实用Python库
Jan 23 #Python
17个Python小技巧分享
Jan 23 #Python
Windows8下安装Python的BeautifulSoup
Jan 22 #Python
You might like
php学习 函数 课件
2008/06/15 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
2015/04/17 PHP
php模拟post上传图片实现代码
2016/06/24 PHP
jQuery移除tr无效的解决方法(tr是动态添加)
2014/09/22 Javascript
jquery 实现返回顶部功能
2014/11/17 Javascript
js实现发送验证码后的倒计时功能
2015/05/28 Javascript
this,this,再次讨论javascript中的this,超全面(经典)
2016/01/05 Javascript
JS实现HTML表格排序功能
2016/08/05 Javascript
JavaScript里 ==与===区别详解
2016/08/16 Javascript
jQuery实现的瀑布流加载效果示例
2016/09/13 Javascript
js编写简单的计时器功能
2017/07/15 Javascript
随机生成10个不重复的0-100的数字(实例讲解)
2017/08/16 Javascript
vue.js实现简单轮播图效果
2017/10/10 Javascript
实例教学如何写vue插件
2017/11/30 Javascript
11行JS代码制作二维码生成功能
2018/03/09 Javascript
详解JSON Web Token 入门教程
2018/07/30 Javascript
基于vue实现web端超大数据量表格的卡顿解决
2019/04/02 Javascript
详解JavaScript中精度失准问题及解决方法
2020/02/04 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
2020/07/19 Javascript
[03:23:49]2016.12.17日完美“圣”典全回顾
2016/12/19 DOTA
python3学习笔记之多进程分布式小例子
2018/02/13 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
2018/12/17 Python
用Python实现BP神经网络(附代码)
2019/07/10 Python
Python环境配置实现pip加速过程解析
2020/11/27 Python
日本网路线上商品代购服务:转送JAPAN
2016/08/05 全球购物
AVON雅芳官网:世界上最大的美容化妆品公司之一
2016/11/02 全球购物
巴黎欧莱雅法国官网:L’Oreal Paris
2019/04/30 全球购物
暑期实习鉴定
2013/12/16 职场文书
党员承诺书格式
2014/05/21 职场文书
环保志愿者活动总结
2014/06/27 职场文书
教学质量月活动总结
2015/05/11 职场文书
简历中的自我评价应该这样写!
2019/07/12 职场文书
详解GaussDB for MySQL性能优化
2021/05/18 MySQL
python实现股票历史数据可视化分析案例
2021/06/10 Python
Python re.sub 反向引用的实现
2021/07/07 Python
Redis 的查询很快的原因解析及Redis 如何保证查询的高效
2022/03/16 Redis