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 相关文章推荐
使用PDB模式调试Python程序介绍
Apr 05 Python
由浅入深讲解python中的yield与generator
Apr 05 Python
Python实现自动上京东抢手机
Feb 06 Python
用python3教你任意Html主内容提取功能
Nov 05 Python
python实现单链表的方法示例
Sep 03 Python
使用PyCharm进行远程开发和调试的实现
Nov 04 Python
python如何写个俄罗斯方块
Nov 06 Python
详解Django自定义图片和文件上传路径(upload_to)的2种方式
Dec 01 Python
python 检测图片是否有马赛克
Dec 01 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
Jan 28 Python
python lambda的使用详解
Feb 26 Python
Django 实现jwt认证的示例
Apr 30 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遍历数组的方法汇总分析
2013/06/08 PHP
PHP标准类(stdclass)用法示例
2016/09/28 PHP
JavaScript 类型的包装对象(Typed Wrappers)
2011/10/27 Javascript
原生js写的放大镜效果
2012/08/22 Javascript
javascript 星级评分效果(手写)
2012/12/24 Javascript
基于jquery的9行js轻松实现tab控件示例
2013/10/12 Javascript
对js关键字命名的疑问介绍
2014/04/25 Javascript
谈谈对offsetleft兼容性的理解
2015/11/11 Javascript
jQuery实现的图片轮播效果完整示例
2016/09/12 Javascript
js仿支付宝多方框输入支付密码效果
2016/09/27 Javascript
JavaScript中boolean类型之三种情景实例代码
2016/11/21 Javascript
js实现点击按钮弹出上传文件的窗口
2016/12/23 Javascript
js实现模糊匹配功能
2017/02/15 Javascript
MUI实现上拉加载和下拉刷新效果
2017/06/30 Javascript
浅谈Node 调试工具入门教程
2018/03/20 Javascript
浅谈微信小程序flex布局基础
2018/09/10 Javascript
Element 默认勾选表格 toggleRowSelection的实现
2019/09/04 Javascript
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
详解JS函数防抖
2020/06/05 Javascript
VsCode里的Vue模板的实现
2020/08/12 Javascript
[03:07]【DOTA2亚洲邀请赛】我们,梦开始的地方
2017/03/07 DOTA
安装ElasticSearch搜索工具并配置Python驱动的方法
2015/12/22 Python
Python中input与raw_input 之间的比较
2017/08/20 Python
python实现xlsx文件分析详解
2018/01/02 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
python 导入数据及作图的实现
2019/12/03 Python
CSS3系列教程:背景图片(背景大小和多背景图) 应用说明
2012/12/19 HTML / CSS
欧洲最大的婴幼儿服装及内衣公司:Petit Bateau(小帆船)
2016/08/16 全球购物
数据库基础的一些面试题
2012/02/25 面试题
医院护士求职自荐信格式
2013/09/21 职场文书
一体化教学实施方案
2014/05/10 职场文书
物流管理专业自荐信
2014/06/23 职场文书
2015年学生会干事工作总结
2015/04/09 职场文书
2015年医药代表工作总结
2015/04/25 职场文书
Python使用openpyxl模块处理Excel文件
2022/06/05 Python