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中__call__方法示例分析
Oct 11 Python
python模拟enum枚举类型的方法小结
Apr 30 Python
Python求导数的方法
May 09 Python
Python IDE PyCharm的基本快捷键和配置简介
Nov 04 Python
Python简单计算数组元素平均值的方法示例
Dec 26 Python
Python切片索引用法示例
May 15 Python
Python中一些不为人知的基础技巧总结
May 19 Python
利用pyecharts读取csv并进行数据统计可视化的实现
Apr 17 Python
python 实现图片修复(可用于去水印)
Nov 19 Python
python opencv实现直线检测并测出倾斜角度(附源码+注释)
Dec 31 Python
解决Pycharm 运行后没有输出的问题
Feb 05 Python
解决pytorch 保存模型遇到的问题
Mar 03 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 开发环境配置(Zend Server安装)
2010/04/28 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
2014/10/16 PHP
php中namespace use用法实例分析
2016/01/22 PHP
完美利用Yii2微信后台开发的系列总结
2016/07/18 PHP
PHP文件操作详解
2016/12/30 PHP
php 人员权限管理(RBAC)实例(推荐)
2017/05/24 PHP
PHP实现一个多功能购物网站的案例
2017/09/13 PHP
图片完美缩放
2006/09/07 Javascript
var与Javascript变量隐式声明
2009/09/17 Javascript
jquery中的on方法使用介绍
2013/12/29 Javascript
JS 获取鼠标左右键的键值方法
2014/10/11 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
2015/08/27 Javascript
提升jQuery的性能需要做好七件事
2016/01/11 Javascript
AngularJS页面访问时出现页面闪烁问题的解决
2016/03/06 Javascript
jQuery+CSS3文字跑马灯特效的简单实现
2016/06/25 Javascript
js时间控件只显示年月
2017/01/08 Javascript
Vue中保存数据到磁盘文件的方法
2018/09/06 Javascript
vue 点击展开显示更多(点击收起部分隐藏)
2019/04/09 Javascript
详解如何模拟实现node中的Events模块(通俗易懂版)
2019/04/15 Javascript
Python学习笔记(二)基础语法
2014/06/06 Python
python使用mysql数据库示例代码
2017/05/21 Python
Python实现的简单读写csv文件操作示例
2018/07/12 Python
pycharm中使用anaconda部署python环境的方法步骤
2018/12/19 Python
python异步实现定时任务和周期任务的方法
2019/06/29 Python
python控制台实现tab补全和清屏的例子
2019/08/20 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
2019/09/11 Python
使用浏览器访问python写的服务器程序
2019/10/10 Python
python Scrapy框架原理解析
2021/01/04 Python
CSS3 filter(滤镜)实现网页灰色或者黑色模式的示例代码
2021/02/24 HTML / CSS
Dr. Martens马汀博士德国官网:马丁靴鼻祖
2019/12/26 全球购物
医学生职业规划范文
2014/01/05 职场文书
《难忘的泼水节》教学反思
2014/02/27 职场文书
历史专业大学生职业生涯规划书
2014/03/13 职场文书
读书演讲主持词
2014/03/18 职场文书
Nginx如何配置Http、Https、WS、WSS的方法步骤
2021/05/11 Servers
欧元符号 €
2022/02/17 杂记