Python中实现常量(Const)功能


Posted in Python onJanuary 28, 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的区别

1.import module只是将module的name加入到目标文件的局部字典中,不需要对module进行解释
2.from module import xxx需要将module解释后加载至内存中,再将相应部分加入目标文件的局部字典中
3.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爬虫之urllib2中的两个重要概念:Openers和Handlers
Nov 05 Python
Python 序列化 pickle/cPickle模块使用介绍
Nov 30 Python
python对数组进行反转的方法
May 20 Python
python中快速进行多个字符替换的方法小结
Dec 15 Python
tensorflow实现对图片的读取的示例代码
Feb 12 Python
Python wxPython库消息对话框MessageDialog用法示例
Sep 03 Python
在Python中如何传递任意数量的实参的示例代码
Mar 21 Python
Python3 实现文件批量重命名示例代码
Jun 03 Python
python基础 range的用法解析
Aug 23 Python
在Pytorch中计算卷积方法的区别详解(conv2d的区别)
Jan 03 Python
Python flask框架如何显示图像到web页面
Jun 03 Python
python使用glob检索文件的操作
May 20 Python
Python使用random和tertools模块解一些经典概率问题
Jan 28 #Python
Python中的异常处理学习笔记
Jan 28 #Python
Python中集合类型(set)学习小结
Jan 28 #Python
Python中使用装饰器和元编程实现结构体类实例
Jan 28 #Python
Python实现Const详解
Jan 27 #Python
python映射列表实例分析
Jan 26 #Python
Python操作MySQL简单实现方法
Jan 26 #Python
You might like
PHP 读取文本文件内容并分页显示
2016/01/02 PHP
Zend Framework基本页面布局分析
2016/03/19 PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
2016/12/07 PHP
laravel中命名路由的使用方法
2017/02/24 PHP
Nigma vs Alliance BO5 第一场2.14
2021/03/10 DOTA
侧栏跟随滚动的简单实现代码
2013/03/18 Javascript
javascript打印输出json实例
2013/11/11 Javascript
jQuery实现鼠标划过添加和删除class的方法
2015/06/26 Javascript
Javascript中Date类型和Math类型详解
2016/02/27 Javascript
jQuery根据表单name获取值的方法
2016/05/24 Javascript
JS对HTML表格进行增删改操作
2016/08/22 Javascript
JavaScript数据结构之广义表的定义与表示方法详解
2017/04/12 Javascript
vue二级路由设置方法
2018/02/09 Javascript
JS实现简单的抽奖转盘效果示例
2019/02/16 Javascript
详解如何理解vue的key属性
2019/04/14 Javascript
小程序分页实践之编写可复用分页组件
2019/07/18 Javascript
从零撸一个pc端vue的ui组件库( 计数器组件 )
2019/08/08 Javascript
如何使用Javascript中的this关键字
2020/05/28 Javascript
[01:14]3.19DOTA2发布会 三代刀塔人第二代
2014/03/25 DOTA
[58:15]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 NB vs Liquid
2018/04/02 DOTA
Python异常处理例题整理
2019/07/07 Python
Django搭建项目实战与避坑细节详解
2020/12/06 Python
HTML5超文本标记语言的实现方法
2020/09/24 HTML / CSS
莫斯科的韩国化妆品店:Sifo
2019/12/04 全球购物
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/01/13 面试题
酒店总经理欢迎词
2014/01/15 职场文书
铁路个人事迹材料
2014/01/30 职场文书
给面试官的感谢信
2014/02/01 职场文书
顶撞老师检讨书
2014/02/07 职场文书
对标管理实施方案
2014/03/12 职场文书
小班下学期评语
2014/05/04 职场文书
护士节演讲稿开场白
2014/08/25 职场文书
让世界充满爱观后感
2015/06/10 职场文书
幼儿园教师培训心得体会
2016/01/21 职场文书
读《推着妈妈去旅行》有感1500字
2019/10/15 职场文书
springcloud整合seata
2022/05/20 Java/Android