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 相关文章推荐
Pycharm技巧之代码跳转该如何回退
Jul 16 Python
Python实现的十进制小数与二进制小数相互转换功能
Oct 12 Python
python使用for循环计算0-100的整数的和方法
Feb 01 Python
用Python中的turtle模块画图两只小羊方法
Apr 09 Python
解决Django migrate不能发现app.models的表问题
Aug 31 Python
python分布式编程实现过程解析
Nov 08 Python
python 实现return返回多个值
Nov 19 Python
jupyter notebook 增加kernel教程
Apr 10 Python
Keras设定GPU使用内存大小方式(Tensorflow backend)
May 22 Python
Python是什么 Python的用处
May 26 Python
python 装饰器重要在哪
Feb 14 Python
Python使用Beautiful Soup(BS4)库解析HTML和XML
Jun 05 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 提取图片img标记中的任意属性的简单实例
2013/12/10 PHP
ThinkPHP 404页面的设置方法
2015/01/14 PHP
php in_array() 检查数组中是否存在某个值详解
2016/11/23 PHP
PHP魔术方法之__call与__callStatic使用方法
2017/07/23 PHP
基于jquery & json的省市区联动代码
2012/06/26 Javascript
JS实现黑色大气的二级导航菜单效果
2015/09/18 Javascript
javascript实现加载xml文件的方法
2015/11/24 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
2016/05/13 Javascript
浅谈JavaScript中小数和大整数的精度丢失
2016/05/31 Javascript
对javascript继承的理解
2016/10/11 Javascript
深入理解jquery中的each用法
2016/12/14 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
解决vue 路由变化页面数据不刷新的问题
2018/03/13 Javascript
NodeJS安装图文教程
2018/04/19 NodeJs
详解如何使用webpack打包JS
2018/06/21 Javascript
Vue下拉框回显并默认选中随机问题
2018/09/06 Javascript
vue 列表页跳转详情页获取id以及详情页通过id获取数据
2019/03/27 Javascript
微信小程序在ios下Echarts图表不能滑动的问题解决
2019/07/10 Javascript
[02:33]2018 DOTA2亚洲邀请赛回顾视频 再次拾起那些美妙的时刻
2018/04/10 DOTA
Python里disconnect UDP套接字的方法
2015/04/23 Python
Python中的字典与成员运算符初步探究
2015/10/13 Python
django表单实现下拉框的示例讲解
2018/05/29 Python
python解析json串与正则匹配对比方法
2018/12/20 Python
python利用openpyxl拆分多个工作表的工作簿的方法
2019/09/27 Python
解决pycharm中导入自己写的.py函数出错问题
2020/02/12 Python
荷兰街头时尚之家:Funkie House
2019/03/18 全球购物
土木工程个人自荐信范文
2013/11/30 职场文书
大学毕业生的自我鉴定
2013/11/30 职场文书
注塑工厂厂长岗位职责
2013/12/02 职场文书
《菜园里》教学反思
2014/04/17 职场文书
Python 如何安装Selenium
2021/05/06 Python
MySql新手入门的基本操作汇总
2021/05/13 MySQL
Ruby序列化和持久化存储 Marshal和Pstore介绍
2022/04/18 Ruby
vue 把二维或多维数组转一维数组
2022/04/24 Vue.js
在虚拟机中安装windows server 2008的图文教程
2022/06/28 Servers
SpringBoot详解执行过程
2022/07/15 Java/Android