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交换变量
Sep 06 Python
在Python中处理日期和时间的基本知识点整理汇总
May 22 Python
python实现数据预处理之填充缺失值的示例
Dec 22 Python
判断python字典中key是否存在的两种方法
Aug 10 Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
Jun 21 Python
windows下Python安装、使用教程和Notepad++的使用教程
Oct 06 Python
python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
Nov 28 Python
Python 实现敏感目录扫描的示例代码
May 21 Python
python输出结果刷新及进度条的实现操作
Jul 13 Python
python批量生成身份证号到Excel的两种方法实例
Jan 14 Python
Python实现粒子群算法的示例
Feb 14 Python
解决pytorch-gpu 安装失败的记录
May 24 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/20 PHP
PHP两个n位的二进制整数相加问题的解决
2018/08/26 PHP
javascript高级学习笔记整理
2011/08/14 Javascript
不使用浏览器运行javascript代码的方法
2013/07/24 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
2014/12/12 Javascript
jquery实现简易的移动端验证表单
2015/11/08 Javascript
AngularJS ng-mousedown 指令
2016/08/02 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(一)
2017/01/21 Javascript
Webpack优化配置缩小文件搜索范围
2017/12/25 Javascript
vue 实现全选全不选的示例代码
2018/03/29 Javascript
浅谈Node.js 中间件模式
2018/06/12 Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
2018/08/20 Javascript
详解vue-cli项目开发/生产环境代理实现跨域请求
2019/07/23 Javascript
vue 中 命名视图的用法实例详解
2019/08/14 Javascript
微信小程序添加插屏广告并设置显示频率(一天一次)
2019/12/06 Javascript
jQuery操作元素的内容和样式完整实例分析
2020/01/10 jQuery
vue 导航菜单刷新状态不消失,显示对应的路由界面操作
2020/08/06 Javascript
python中偏函数partial用法实例分析
2015/07/08 Python
Python实现excel转sqlite的方法
2017/07/17 Python
python 读取dicom文件,生成info.txt和raw文件的方法
2019/01/24 Python
解决python明明pip安装成功却找不到包的问题
2019/08/28 Python
python多线程并发及测试框架案例
2019/10/15 Python
Python过滤掉numpy.array中非nan数据实例
2020/06/08 Python
python实现数据结构中双向循环链表操作的示例
2020/10/09 Python
Pycharm安装第三方库失败解决方案
2020/11/17 Python
在pycharm创建scrapy项目的实现步骤
2020/12/01 Python
HTML5打开手机扫码功能及优缺点
2017/11/27 HTML / CSS
Laura Mercier官网:彩妆大师罗拉玛斯亚的化妆品牌
2018/01/04 全球购物
餐饮业员工工作决心书
2014/03/11 职场文书
公司办公室岗位职责
2014/03/19 职场文书
产品包装策划方案
2014/05/18 职场文书
法人代表任命书范本
2014/06/05 职场文书
学校领导班子四风对照检查材料
2014/09/27 职场文书
商场圣诞节活动总结
2015/05/06 职场文书
老乡会致辞
2015/07/28 职场文书
PyTorch 如何设置随机数种子使结果可复现
2021/05/12 Python