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中datetime模块参考手册
Jan 13 Python
TensorFlow如何实现反向传播
Feb 06 Python
将Django项目部署到CentOs服务器中
Oct 18 Python
python实现K近邻回归,采用等权重和不等权重的方法
Jan 23 Python
简单了解Python读取大文件代码实例
Dec 18 Python
python与mysql数据库交互的实现
Jan 06 Python
Python中用pyinstaller打包时的图标问题及解决方法
Feb 17 Python
Python chardet库识别编码原理解析
Feb 18 Python
keras 获取某层输出 获取复用层的多次输出实例
May 23 Python
Python同时处理多个异常的方法
Jul 28 Python
Pycharm 2020.1 版配置优化的详细教程
Aug 07 Python
互斥锁解决 Python 中多线程共享全局变量的问题(推荐)
Sep 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
php中echo()和print()、require()和include()等易混淆函数的区别
2012/02/22 PHP
完美解决:Apache启动问题―(OS 10022)提供了一个无效的参数
2013/06/08 PHP
Javascript的IE和Firefox兼容性汇编(zz)
2007/02/02 Javascript
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
jQuery获取节点和子节点文本的方法
2014/07/22 Javascript
Windows系统下Node.js的简单入门教程
2015/06/23 Javascript
简单对比分析JavaScript中的apply,call与this的使用
2015/12/04 Javascript
Laravel中常见的错误与解决方法小结
2016/08/30 Javascript
详解Js模板引擎(TrimPath)
2016/11/22 Javascript
js实现背景图自适应窗口大小
2017/01/10 Javascript
Javascript中的prototype与继承
2017/02/06 Javascript
vue项目环境变量配置的实现方法
2018/10/12 Javascript
详解小程序云开发数据库
2019/05/20 Javascript
vue回到顶部监听滚动事件详解
2019/08/02 Javascript
vue 中 elment-ui table合并上下两行相同数据单元格
2019/12/26 Javascript
npm ci命令的基本使用方法
2020/09/20 Javascript
NodeJS模块Buffer原理及使用方法解析
2020/11/11 NodeJs
[01:32:50]DOTA2-DPC中国联赛 正赛 DLG vs XG BO3 第一场 1月25日
2021/03/11 DOTA
介绍Python中的一些高级编程技巧
2015/04/02 Python
Django与遗留的数据库整合的方法指南
2015/07/24 Python
详解Python设计模式编程中观察者模式与策略模式的运用
2016/03/02 Python
python strip() 函数和 split() 函数的详解及实例
2017/02/03 Python
对python周期性定时器的示例详解
2019/02/19 Python
python匿名函数的使用方法解析
2019/10/10 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
python 实现ping测试延迟的两种方法
2020/12/10 Python
美国领先的低折扣旅行网站:Hotwire
2019/01/19 全球购物
高三自我鉴定怎么写
2013/10/19 职场文书
餐饮商业计划书范文
2014/04/29 职场文书
学生偷窃检讨书
2014/09/25 职场文书
政风行风建设整改方案
2014/10/27 职场文书
《百分数的认识》教学反思
2016/02/19 职场文书
《彼得与狼》教学反思
2016/02/20 职场文书
Nginx的反向代理实例详解
2021/03/31 Servers
缓存替换策略及应用(以Redis、InnoDB为例)
2021/07/25 Redis
Python中的程序流程控制语句
2022/02/24 Python