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实现通过pil模块对图片格式进行转换的方法
Mar 24 Python
Python的Flask框架标配模板引擎Jinja2的使用教程
Jul 12 Python
详谈套接字中SO_REUSEPORT和SO_REUSEADDR的区别
Apr 28 Python
基于python神经卷积网络的人脸识别
May 24 Python
Python判断以什么结尾以什么开头的实例
Oct 27 Python
Python后台开发Django会话控制的实现
Apr 15 Python
对Python的交互模式和直接运行.py文件的区别详解
Jun 29 Python
解决安装python3.7.4报错Can''t connect to HTTPS URL because the SSL module is not available
Jul 31 Python
python实现小世界网络生成
Nov 21 Python
Python的Django框架实现数据库查询(不返回QuerySet的方法)
May 19 Python
这样写python注释让代码更加的优雅
Jun 02 Python
python脚本框架webpy模板赋值实现
Nov 20 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语法(4)
2006/10/09 PHP
用php实现像JSP,ASP里Application那样的全局变量
2007/01/12 PHP
phpMyAdmin下载、安装和使用入门教程
2007/05/31 PHP
Smarty中调用FCKeditor的方法
2014/10/27 PHP
php单例模式示例分享
2015/02/12 PHP
php实现俄罗斯乘法实例
2015/03/07 PHP
php实现根据IP地址获取其所在省市的方法
2015/04/30 PHP
php实现的二分查找算法示例
2017/06/20 PHP
php接口隔离原则实例分析
2019/11/11 PHP
借助JavaScript脚本判断浏览器Flash Player信息的方法
2014/07/09 Javascript
javascript编程异常处理实例小结
2015/11/30 Javascript
jQuery获取radio选中项的值实例
2016/06/18 Javascript
Reactjs实现通用分页组件的实例代码
2017/01/19 Javascript
全面总结Javascript对数组对象的各种操作
2017/01/22 Javascript
inner join 内联与left join 左联的实例代码
2017/09/18 Javascript
[原创]jquery判断元素内容是否为空的方法
2018/05/04 jQuery
webstorm中vue语法的支持详解
2018/05/09 Javascript
webpack4简单入门实例
2018/09/06 Javascript
Python中将dataframe转换为字典的实例
2018/04/13 Python
解决python大批量读写.doc文件的问题
2018/05/08 Python
Python 存储字符串时节省空间的方法
2019/04/23 Python
Python求两点之间的直线距离(2种实现方法)
2019/07/07 Python
Django ORM 查询管理器源码解析
2019/08/05 Python
Python的PIL库中getpixel方法的使用
2020/04/09 Python
css3 线性渐变和径向渐变示例附图
2014/04/08 HTML / CSS
html5 学习简单的拾色器
2010/09/03 HTML / CSS
南非最大的花卉和送礼服务:NetFlorist
2017/09/13 全球购物
SQL面试题
2013/12/09 面试题
建筑施工员岗位职责
2013/11/26 职场文书
民族团结先进集体事迹材料
2014/05/22 职场文书
违纪检讨书范文
2015/01/27 职场文书
幼儿园园长安全责任书
2015/05/08 职场文书
python xlwt模块的使用解析
2021/04/13 Python
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis
80行代码写一个Webpack插件并发布到npm
2021/05/24 Javascript
MYSQL如何查看进程和kill进程
2022/03/13 MySQL