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使用xlrd实现检索excel中某列含有指定字符串记录的方法
May 09 Python
python strip() 函数和 split() 函数的详解及实例
Feb 03 Python
python僵尸进程产生的原因
Jul 21 Python
python利用paramiko连接远程服务器执行命令的方法
Oct 16 Python
Python 类的特殊成员解析
Jun 20 Python
Python中分支语句与循环语句实例详解
Sep 13 Python
在Python中实现shuffle给列表洗牌
Nov 08 Python
python matplotlib中的subplot函数使用详解
Jan 19 Python
python连接打印机实现打印文档、图片、pdf文件等功能
Feb 07 Python
PyCharm取消波浪线、下划线和中划线的实现
Mar 03 Python
最简单的matplotlib安装教程(小白)
Jul 28 Python
Python自动化实战之接口请求的实现
May 30 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
smarty 原来也不过如此~~呵呵
2006/11/25 PHP
php ios推送(代码)
2013/07/01 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
javascript的键盘控制事件说明
2008/04/15 Javascript
jQuery中绑定事件的命名空间详解
2011/04/05 Javascript
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
2011/06/27 Javascript
js操作textarea 常用方法总结
2012/12/03 Javascript
解析javascript 实用函数的使用详解
2013/05/10 Javascript
javascript实现简单的可随机变色网页计算器示例
2016/12/30 Javascript
浅谈Vue.js 1.x 和 2.x 实例的生命周期
2017/07/25 Javascript
Node.js学习教程之HTTP/2服务器推送【译】
2017/10/31 Javascript
使用Layui搭建后台管理界面的操作方法
2019/09/20 Javascript
中级前端工程师必须要掌握的27个JavaScript 技巧(干货总结)
2019/09/23 Javascript
vue-router的钩子函数用法实例分析
2019/10/26 Javascript
Vue项目中Api的组织和返回数据处理的操作
2019/11/04 Javascript
JavaScript中变量提升机制示例详解
2019/12/27 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
2020/08/14 Javascript
解决antd日期选择组件,添加value就无法点击下一年和下一月问题
2020/10/29 Javascript
vue中activated的用法
2021/01/03 Vue.js
[03:05]DOTA2英雄基础教程 嗜血狂魔
2013/12/10 DOTA
[00:11]战神迅矛
2019/03/06 DOTA
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
2019/03/14 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
2020/02/09 Python
使用python绘制cdf的多种实现方法
2020/02/25 Python
python对execl 处理操作代码
2020/06/22 Python
HTML5给汉字加拼音收起展开组件的实现代码
2020/04/08 HTML / CSS
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
美国波西米亚风格服装品牌:Show Me Your Mumu
2018/01/05 全球购物
Agoda台湾官网:国内外订房2折起
2018/03/20 全球购物
全球精选男装和家居用品:Article
2020/04/13 全球购物
新学期开学寄语
2014/01/18 职场文书
欢送退休感言
2014/02/08 职场文书
大学生两会精神学习心得体会
2014/03/10 职场文书
班级管理经验交流材料
2015/11/02 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python
Python 机器学习工具包SKlearn的安装与使用
2021/05/14 Python