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多进程通信Queue、Pipe、Value、Array实例
Nov 21 Python
C#返回当前系统所有可用驱动器符号的方法
Apr 18 Python
Python内置模块hashlib、hmac与uuid用法分析
Feb 12 Python
Python读取本地文件并解析网页元素的方法
May 21 Python
python join方法使用详解
Jul 30 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
Sep 18 Python
Python使用__new__()方法为对象分配内存及返回对象的引用示例
Sep 20 Python
Python3实现将一维数组按标准长度分隔为二维数组
Nov 29 Python
Python基于内置库pytesseract实现图片验证码识别功能
Feb 24 Python
在keras里面实现计算f1-score的代码
Jun 15 Python
python右对齐的实例方法
Jul 05 Python
Python基础详解之邮件处理
Apr 28 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
搜索引擎技术核心揭密
2006/10/09 PHP
PHP中数组合并的两种方法及区别介绍
2012/09/14 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
2015/12/17 PHP
作为PHP程序员你要知道的另外一种日志
2018/07/30 PHP
php生成HTML文件的类方法
2019/10/11 PHP
jquery DOM操作 基于命令改变页面
2010/05/06 Javascript
javascript使用中为什么10..toString()正常而10.toString()出错呢
2013/01/11 Javascript
jQuery中width()方法用法实例
2014/12/24 Javascript
浅析JavaScript作用域链、执行上下文与闭包
2016/02/01 Javascript
Javascript单例模式的介绍和实例
2016/10/08 Javascript
canvas绘制万花筒效果(代码分享)
2017/01/20 Javascript
原生JavaScript实现Tooltip浮动提示框特效
2017/03/07 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
2017/07/12 Javascript
mockjs,json-server一起搭建前端通用的数据模拟框架教程
2017/12/18 Javascript
Node.js静态服务器的实现方法
2018/02/28 Javascript
vue-prop父组件向子组件进行传值的方法
2018/03/01 Javascript
jQuery插件实现弹性运动完整示例
2018/07/07 jQuery
jQuery实现简单的Ajax调用功能示例
2019/02/15 jQuery
微信小程序设置全局请求URL及封装wx.request请求操作示例
2019/04/02 Javascript
layui表单验证select下拉框实现验证的方法
2019/09/05 Javascript
vue实现循环滚动列表
2020/06/30 Javascript
微信小程序实现日历签到
2020/09/21 Javascript
[02:32]“虐狗”镜头慎点 2016国际邀请赛中国区预选赛现场玩家采访
2016/06/28 DOTA
Python实现爬取马云的微博功能示例
2019/02/16 Python
PyQt5 多窗口连接实例
2019/06/19 Python
Django用户认证系统 User对象解析
2019/08/02 Python
django框架使用views.py的函数对表进行增删改查内容操作详解【models.py中表的创建、views.py中函数的使用,基于对象的跨表查询】
2019/12/12 Python
jupyter notebook清除输出方式
2020/04/10 Python
Python如何对齐字符串
2020/07/30 Python
Python 实现RSA加解密文本文件
2020/12/30 Python
12月小学生校园广播稿
2014/02/04 职场文书
办公室综合文员岗位职责范本
2014/02/13 职场文书
宾馆仓管员岗位职责
2014/07/27 职场文书
医生个人年终总结
2015/02/28 职场文书
家装业务员岗位职责
2015/04/03 职场文书
赞美教师的句子
2019/09/02 职场文书