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连接mssql数据库编码问题解决方法
Jan 01 Python
python制作爬虫爬取京东商品评论教程
Dec 16 Python
python探索之BaseHTTPServer-实现Web服务器介绍
Oct 28 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
Oct 29 Python
python与字符编码问题
May 24 Python
Python3.0 实现决策树算法的流程
Aug 08 Python
Pytorch根据layers的name冻结训练方式
Jan 06 Python
Pycharm激活码激活两种快速方式(附最新激活码和插件)
Mar 12 Python
Win 10下Anaconda虚拟环境的教程
May 18 Python
详解利用python识别图片中的条码(pyzbar)及条码图片矫正和增强
Nov 17 Python
pytorch加载预训练模型与自己模型不匹配的解决方案
May 13 Python
浅谈Python数学建模之固定费用问题
Jun 23 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过滤html字符串,防止SQL注入的方法
2013/07/02 PHP
php实现与erlang的二进制通讯实例解析
2014/07/23 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
jQuery中get()方法用法实例
2014/12/27 Javascript
JS实现在线统计一个页面内鼠标点击次数的方法
2015/02/28 Javascript
jQuery使用drag效果实现自由拖拽div
2015/06/11 Javascript
基于BootStrap Metronic开发框架经验小结【七】数据的导入、导出及附件的查看处理
2016/05/12 Javascript
Bootstrap零基础入门教程(二)
2016/07/18 Javascript
详解用node-images 打造简易图片服务器
2017/05/08 Javascript
中高级前端必须了解的JS中的内存管理(推荐)
2019/07/04 Javascript
微信小程序多列表渲染数据开关互不影响的实现
2020/06/05 Javascript
vue 避免变量赋值后双向绑定的操作
2020/11/07 Javascript
Javascript新手入门之字符串拼接与变量的应用
2020/12/03 Javascript
python生成器的使用方法
2013/11/21 Python
详解Python 序列化Serialize 和 反序列化Deserialize
2017/08/20 Python
Django使用Celery异步任务队列的使用
2018/03/13 Python
解决Python requests库编码 socks5代理的问题
2018/05/07 Python
flask利用flask-wtf验证上传的文件的方法
2020/01/17 Python
Python交互环境下打印和输入函数的实例内容
2020/02/16 Python
CSS3 实现侧边栏展开收起动画
2014/12/22 HTML / CSS
CSS3中的transform属性进行2D和3D变换的基本用法
2016/05/12 HTML / CSS
浅谈Html5页面打开app的一些思考
2020/03/30 HTML / CSS
法国时尚品牌乐都特瑞士站:La Redoute瑞士
2016/09/05 全球购物
俄罗斯Sportmarket体育在线商店:用于旅游和户外活动
2019/11/12 全球购物
Seavenger官网:潜水服、浮潜、靴子和袜子
2020/03/05 全球购物
同步和异步有何异同,在什么情况下分别使用他们?举例说明
2014/02/27 面试题
实习单位评语
2014/04/26 职场文书
产品推广策划方案
2014/05/10 职场文书
师德师风个人自我剖析材料
2014/09/27 职场文书
幼儿园大班教师个人总结
2015/02/05 职场文书
建筑工程催款函
2015/06/24 职场文书
2016优秀教师先进个人事迹材料
2016/02/25 职场文书
小公司融资,商业计划书的8切记
2019/07/15 职场文书
2019大学生社会实践报告汇总
2019/08/16 职场文书
Python 的 sum() Pythonic 的求和方法详细
2021/10/16 Python
MySQL慢查询中的commit慢和binlog中慢事务的区别
2022/06/16 MySQL