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实现KNN分类算法
Dec 22 Python
python递归函数绘制分形树的方法
Jun 22 Python
python操作excel的方法
Aug 16 Python
解决Python2.7中IDLE启动没有反应的问题
Nov 30 Python
python+os根据文件名自动生成文本
Mar 21 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
Jun 17 Python
python turtle库画一个方格和圆实例
Jun 27 Python
使用Python实现图像标记点的坐标输出功能
Aug 14 Python
python实现宿舍管理系统
Nov 22 Python
python redis存入字典序列化存储教程
Jul 16 Python
浅析python 通⽤爬⾍和聚焦爬⾍
Sep 28 Python
python 实现数据库中数据添加、查询与更新的示例代码
Dec 07 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内置函数使用指南
2014/11/27 PHP
php根据某字段对多维数组进行排序的方法
2015/03/07 PHP
php实现网页缓存的工具类分享
2015/07/14 PHP
基于OpenCart 开发支付宝,财付通,微信支付参数错误问题
2015/10/01 PHP
php安装扩展mysqli的实现步骤及报错解决办法
2017/09/23 PHP
RR vs IO BO3 第一场2.13
2021/03/10 DOTA
js控制表单奇偶行样式的简单方法
2013/07/31 Javascript
javascript教程:关于if简写语句优化的方法
2014/05/17 Javascript
Enter回车切换输入焦点实现思路与代码兼容各大浏览器
2014/09/01 Javascript
使用console进行性能测试
2015/04/27 Javascript
ES6中非常实用的新特性介绍
2016/03/10 Javascript
JS中把函数作为另一函数的参数传递方法(总结)
2017/06/28 Javascript
JavaScript闭包的简单应用
2017/09/01 Javascript
three.js实现3D视野缩放效果
2017/11/16 Javascript
微信小程序 数据缓存实现方法详解
2019/08/26 Javascript
微信小程序学习总结(三)条件、模板、文件引用实例分析
2020/06/04 Javascript
Python网络爬虫实例讲解
2016/04/28 Python
Python编程django实现同一个ip十分钟内只能注册一次
2017/11/03 Python
详谈python3中用for循环删除列表中元素的坑
2018/04/19 Python
Python 实现一行输入多个值的方法
2018/04/21 Python
Python中利用xpath解析HTML的方法
2018/05/14 Python
Python Matplotlib实现三维数据的散点图绘制
2019/03/19 Python
Python3.7 新特性之dataclass装饰器
2019/05/27 Python
python binascii 进制转换实例
2019/06/12 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
解决Pytorch训练过程中loss不下降的问题
2020/01/02 Python
在python中实现求输出1-3+5-7+9-......101的和
2020/04/02 Python
python list等分并从等分的子集中随机选取一个数
2020/11/16 Python
基于html5 DeviceOrientation 实现微信摇一摇功能
2015/09/25 HTML / CSS
CAD制图人员的自荐信
2014/02/07 职场文书
十八届三中全会报告学习材料
2014/02/17 职场文书
商铺租赁意向书
2014/04/01 职场文书
学生偷窃检讨书
2014/09/25 职场文书
2016开学第一课心得体会
2016/01/23 职场文书
2019终止劳动合同协议书最新范本!
2019/07/09 职场文书
Redis调用Lua脚本及使用场景快速掌握
2022/03/16 Redis