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获取远程文件大小的函数代码分享
May 13 Python
从零学Python之引用和类属性的初步理解
May 15 Python
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
Jun 07 Python
详解Python中的Descriptor描述符类
Jun 14 Python
Python的包管理器pip更换软件源的方法详解
Jun 20 Python
Python实现删除文件中含“指定内容”的行示例
Jun 09 Python
python数据分析数据标准化及离散化详解
Feb 26 Python
python 通过SSHTunnelForwarder隧道连接redis的方法
Feb 19 Python
python时间序列按频率生成日期的方法
May 14 Python
Python实现某论坛自动签到功能
Aug 20 Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 Python
pytorch中的torch.nn.Conv2d()函数图文详解
Feb 28 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
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
2006/12/06 PHP
php全排列递归算法代码
2012/10/09 PHP
php 利用array_slice函数获取随机数组或前几条数据
2015/09/30 PHP
PHP中使用array函数新建一个数组
2015/11/19 PHP
PHP连接MySQL数据库操作代码实例解析
2020/07/11 PHP
漂亮的提示信息(带箭头)
2007/03/21 Javascript
jQuery中dom元素上绑定的事件详解
2015/04/24 Javascript
JS+HTML5手机开发之滚动和惯性缓动实现方法分析
2016/06/12 Javascript
AngularJS基础 ng-srcset 指令简单示例
2016/08/03 Javascript
javascript计算渐变颜色的实例
2017/09/22 Javascript
two.js之实现动画效果示例
2017/11/06 Javascript
在vue中实现简单页面逆传值的方法
2017/11/27 Javascript
React 使用browserHistory项目访问404问题解决
2018/06/01 Javascript
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
JavaScript面向对象编程小游戏---贪吃蛇代码实例
2019/05/15 Javascript
在vs code 中如何创建一个自己的 Vue 模板代码
2020/11/10 Javascript
Python下singleton模式的实现方法
2014/07/16 Python
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
2016/07/01 Python
利用python如何处理nc数据详解
2018/05/23 Python
django ajax json的实例代码
2018/05/29 Python
对Python中DataFrame选择某列值为XX的行实例详解
2019/01/29 Python
Python自动生成代码 使用tkinter图形化操作并生成代码框架
2019/09/18 Python
使用Python脚本从文件读取数据代码实例
2020/01/19 Python
Java多线程实现四种方式原理详解
2020/06/02 Python
python如何保存文本文件
2020/06/07 Python
一文读懂python Scrapy爬虫框架
2021/02/24 Python
手摸手教你用canvas实现给图片添加平铺水印的实现
2019/08/20 HTML / CSS
EJB面试题
2015/07/28 面试题
办公室岗位职责
2014/02/12 职场文书
医德医风演讲稿
2014/05/20 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
大学生就业协议书范本(适用于公司企业)
2014/10/07 职场文书
2014七年级班主任工作总结
2014/12/05 职场文书
团员个人总结
2015/02/26 职场文书
污水处理保证书
2015/05/09 职场文书
集英社今正式宣布 成立游戏公司“集英社Games”
2022/03/31 其他游戏