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中的身份运算符的使用方法
Oct 13 Python
python编程线性回归代码示例
Dec 07 Python
python中利用h5py模块读取h5文件中的主键方法
Jun 05 Python
python实现淘宝秒杀脚本
Jun 23 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
Feb 19 Python
Django之使用celery和NGINX生成静态页面实现性能优化
Oct 08 Python
python opencv实现gif图片分解的示例代码
Dec 13 Python
PyTorch和Keras计算模型参数的例子
Jan 02 Python
Jupyter Notebook的连接密码 token查询方式
Apr 21 Python
python实现sm2和sm4国密(国家商用密码)算法的示例
Sep 26 Python
python IP地址转整数
Nov 20 Python
Python 读写 Matlab Mat 格式数据的操作
May 19 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入门的学习方法
2007/01/02 PHP
选择PHP作为网站开发语言的原因分享
2012/01/03 PHP
php 解决旧系统 查出所有数据分页的类
2012/08/27 PHP
php中使用preg_replace函数匹配图片并加上链接的方法
2013/02/06 PHP
php调整服务器时间的方法
2015/04/03 PHP
深入浅析PHP7.0新特征(五大新特征)
2015/10/29 PHP
学习php设计模式 php实现状态模式
2015/12/07 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
jquery的each方法使用示例分享
2014/03/25 Javascript
Node.js实现批量去除BOM文件头
2014/12/20 Javascript
php常见的页面跳转方法汇总
2015/04/15 Javascript
详解JavaScript中shift()方法的使用
2015/06/09 Javascript
在Node.js中使用HTTP上传文件的方法
2015/06/23 Javascript
jQuery Real Person验证码插件防止表单自动提交
2015/11/06 Javascript
微信小程序Redux绑定实例详解
2017/06/07 Javascript
webpack配置之后端渲染详解
2017/10/26 Javascript
Angular2之二级路由详解
2018/08/31 Javascript
微信小程序生成海报分享朋友圈的实现方法
2019/05/06 Javascript
了解前端理论:rscss和rsjs
2019/05/23 Javascript
vue登录页面cookie的使用及页面跳转代码
2019/07/10 Javascript
jQuery实现的移动端图片缩放功能组件示例
2020/05/01 jQuery
Bootstrap table 服务器端分页功能实现方法示例
2020/06/01 Javascript
python计算N天之后日期的方法
2015/03/31 Python
简单理解Python中的装饰器
2015/07/31 Python
如何基于Python实现word文档重新排版
2020/09/29 Python
Python使用内置函数setattr设置对象的属性值
2020/10/16 Python
资深生产主管自我评价
2013/09/22 职场文书
物业管理员岗位职责范文
2013/11/25 职场文书
理财投资建议书
2014/03/12 职场文书
合作经营协议书范本
2014/04/17 职场文书
城管执法人员纪律作风整顿思想汇报
2014/09/13 职场文书
民主评议政风行风活动心得体会
2014/10/29 职场文书
大学生求职简历自我评价
2015/03/02 职场文书
Oracle更换为MySQL遇到的问题及解决
2021/05/21 Oracle
javascript之Object.assign()的痛点分析
2022/03/03 Javascript
Matplotlib绘制条形图的方法你知道吗
2022/03/21 Python