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实现从字符串中找出字符1的位置以及个数的方法
Aug 25 Python
Python中计算三角函数之cos()方法的使用简介
May 15 Python
详解在Python的Django框架中创建模板库的方法
Jul 20 Python
深入理解python对json的操作总结
Jan 05 Python
Django实现的自定义访问日志模块示例
Jun 23 Python
用python做一个搜索引擎(Pylucene)的实例代码
Jul 05 Python
Python+Redis实现布隆过滤器
Dec 08 Python
Python读取VOC中的xml目标框实例
Mar 10 Python
Python数据可视化实现漏斗图过程图解
Jul 20 Python
python为什么要安装到c盘
Jul 20 Python
Python约瑟夫生者死者小游戏实例讲解
Jan 04 Python
python 网络编程要点总结
Jun 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
PHP机器学习库php-ml的简单测试和使用方法
2017/07/14 PHP
PHP设计模式之装饰器模式定义与用法详解
2018/04/02 PHP
实例讲解PHP表单处理
2019/02/15 PHP
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
javascript中将Object转换为String函数代码 (json str)
2012/04/29 Javascript
jquery struts 验证唯一标识(公用方法)
2013/03/27 Javascript
在JavaScript中使用timer示例
2014/05/08 Javascript
原生javascript实现图片滚动、延时加载功能
2015/01/12 Javascript
基于jQuery仿淘宝产品图片放大镜代码分享
2020/06/23 Javascript
基于Bootstrap实现图片轮播效果
2016/05/22 Javascript
JavaScript中获取时间的函数集
2016/08/16 Javascript
微信小程序 this和that详解及简单实例
2017/02/13 Javascript
Vue 短信验证码组件开发详解
2017/02/14 Javascript
js中toString()和String()区别详解
2017/03/23 Javascript
vue二级路由设置方法
2018/02/09 Javascript
JS实现运动缓冲效果的封装函数示例
2018/02/18 Javascript
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
vue2中,根据list的id进入对应的详情页并修改title方法
2018/08/24 Javascript
微信小程序实现转盘抽奖
2020/09/21 Javascript
linux下安装easy_install的方法
2013/02/10 Python
使用apidocJs快速生成在线文档的实例讲解
2018/02/07 Python
python+pandas生成指定日期和重采样的方法
2018/04/11 Python
快速解决PyCharm无法引用matplotlib的问题
2018/05/24 Python
Python对象属性自动更新操作示例
2018/06/15 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
2018/07/09 Python
在Python中调用Ping命令,批量IP的方法
2019/01/26 Python
Python爬取365好书中小说代码实例
2020/02/28 Python
HTML5 本地存储和内容按需加载的思路和方法
2011/04/07 HTML / CSS
小学少先队活动方案
2014/02/18 职场文书
工程资料员岗位职责
2014/03/10 职场文书
公务员试用期满考核材料
2014/05/22 职场文书
药品营销策划方案
2014/06/15 职场文书
刑事辩护授权委托书格式
2014/10/13 职场文书
导游词之丽江普济寺
2019/10/22 职场文书
HTML中的表单Form实现居中效果
2021/05/25 HTML / CSS
解决Vmware虚拟机安装centos8报错“Section %Packages Does Not End With %End. Pane Is Dead”
2022/06/01 Servers