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编写提取日志中的中文的脚本的方法
Apr 30 Python
python 爬取微信文章
Jan 30 Python
Python简单检测文本类型的2种方法【基于文件头及cchardet库】
Sep 18 Python
python django事务transaction源码分析详解
Mar 17 Python
python中类和实例如何绑定属性与方法示例详解
Aug 18 Python
python3 图片referer防盗链的实现方法
Mar 12 Python
PyQt4编程之让状态栏显示信息的方法
Jun 18 Python
Python 数据的累加与统计的示例代码
Aug 03 Python
属性与 @property 方法让你的python更高效
Sep 21 Python
python+openCV对视频进行截取的实现
Nov 27 Python
python 爬虫爬取京东ps4售卖情况
Dec 18 Python
python使用scapy模块实现ping扫描的过程详解
Jan 21 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验证码类代码分享(已封装成类)
2011/07/17 PHP
php中数据库连接方式pdo和mysqli对比分析
2015/02/25 PHP
PHP获得数组交集与差集的方法
2015/06/10 PHP
php抓取并保存网站图片的实现代码
2015/10/28 PHP
PHP使用fopen与file_get_contents读取文件实例分享
2016/03/04 PHP
PHP 数组遍历foreach语法结构及实例
2016/06/13 PHP
php实现登录tplink WR882N获取IP和重启的方法
2016/07/20 PHP
老生常谈PHP面向对象之注册表模式
2017/05/26 PHP
PHP获取redis里不存在的6位随机数应用示例【设置24小时过时】
2017/06/07 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
2020/02/27 PHP
javascript获取作用在元素上面的样式属性代码
2012/09/20 Javascript
jquery插件冲突(jquery.noconflict)解决方法分享
2014/03/20 Javascript
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
2014/06/06 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
Extjs4.0 ComboBox如何实现三级联动
2016/05/11 Javascript
javascript小数精度丢失的完美解决方法
2016/05/31 Javascript
真正好用的js验证上传文件大小的简单方法
2016/10/27 Javascript
JavaScript原生节点操作小结
2017/01/17 Javascript
详解使用React进行组件库开发
2018/02/06 Javascript
nodejs实现一个word文档解析器思路详解
2018/08/14 NodeJs
jquery分页插件pagination使用教程
2018/10/23 jQuery
小程序中的箭头函数的具体使用
2020/06/19 Javascript
vue:el-input输入时限制输入的类型操作
2020/08/05 Javascript
[01:03:56]Mineski vs TNC 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
Python3基于sax解析xml操作示例
2018/05/22 Python
python连接、操作mongodb数据库的方法实例详解
2019/09/11 Python
python 三元运算符使用解析
2019/09/16 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
2020/02/26 Python
pygame用blit()实现动画效果的示例代码
2020/05/28 Python
Django缓存Cache使用详解
2020/11/30 Python
奢华时尚的创新平台:Baltini
2020/10/03 全球购物
致跳远、跳高运动员广播稿
2014/01/09 职场文书
简单的项目建议书模板
2014/03/12 职场文书
社区护士演讲稿
2014/08/27 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书
Ajax实现异步加载数据
2021/11/17 Javascript