python实现不可修改的常量
因为种种原因,Python并未提供如C/C++/Java一样的const修饰符,换言之,python中没有常量,至少截止2015年年末,还没有这个打算。Python程序一般通过约定俗成的变量名全大写的形式来表示这是一个常量,但是这终究不是长久之计。
其实Python可以曲线救国实现常量。
在Python的面向对象中,
object.__setattr__()
这个built-in function在对类的属性赋值的时候会自动调用。其函数原型为:
object.__setattr__(self, name, value)
其中name为变量名,value为变量值。
而object.__dict__则以dict的形式保存了object内所有可写的属性,key为变量名,value为变量值。
那么我们就有可能通过建立一个const类,对其object.__setattr__()方法进行overwrite,在对属性值进行赋值的时候判断,如果属性存在,则表示这是对常量的重赋值操作,从而抛出异常,如果属性不存在,则表示是新声明了一个常量,可以进行赋值操作。
const.py 代码如下:
# -*- coding: utf-8 -*- class _const:
class ConstError(TypeError) : pass def __setattr__(self, key, value):
# self.__dict__
if self.__dict__.has_key(key):
raise self.ConstError,"constant reassignment error!"
self.__dict__[key] = value import sys sys.modules[__name__] = _const()
其中,1-10行是上述思路的类的一个实现。
第12-14行的写法值得说明。我们尽管拥有了_const类,但是我们当前使用这个类仍然需要
import const c = const._const()
c.TEST_CONSTANT = 'test'
这样的形式来声明一个常量TEST_CONSTANT,然而我们希望用更简洁的方法进行常量的赋值。形如:
import const const.TEST_CONSTANT = 'test'
在python中,__name__内置属性是当前的class或者type的值。通俗地讲,__name__的值有以下两种形式:
- 如果运行某一个py文件,在该文件中,__name__的值为'__main__'
- 如果import了某一个py文件,那么在该import的文件中,__name__的值为该文件的文件名(不带.py后缀)
而sys.modules是一个dict对象,包括了当前上下文中python已经load的所有模块的信息,dict的key为文件名,value为模块对象。
在const.py
中,14行的写法等价于
import const sys.modules['const'] = _const()
即,让_const类作为模块的入口点,引入const.py等价于声明了一个_const类的实例。
至此python的常量实现完毕,使用test.py测试:
# -*- coding: utf-8 -*- import const const.TEST = 'test'
print const.TEST
const.TEST1 = 'test1'
print const.TEST1
const.TEST = 'test'
print const.TEST
打印信息如下:
test
test1
Traceback (most recent call last):
File "H:/code/test.py", line 9, in <module>
const.TEST = 'test'
File "H:\code\const.py", line 9, in __setattr__
raise self.ConstError,"constant reassigning error!"
const.ConstError: constant reassignment error!
成功为两常量赋值,在试图修改第一个常量值时抛出异常:)
python实现不可修改的常量的更多相关文章
- Python中的变量和常量
本文主要介绍Python中的变量和常量,包括变量的命名规范,使用注意事项 -------------- 完美的分割线 --------------- 1.变量 1.1.变量理解 1)什么是变量 变量即 ...
- 简述Python垃圾回收机制和常量池的验证
目录 通过代码验证python解释器内部使用了常量池 Python的引入 变量的引入 为什么要有变量 定义变量 常量引入 常量池引入 Python解释器 Python变量存储机制 Python垃圾回收 ...
- Python基础部分:5、 python语法之变量与常量
目录 python语法之变量与常量 一.什么是变量与常量 1.什么是变量 2.什么是常量 二.变量的基本使用 1.代码中如何记录事物状态 2.变量使用的语法结构与底层原理 3.变量名的命名规范 4.变 ...
- Python默认版本修改
Python默认版本修改 当电脑安装了多个版本的Python,而Shell中默认的Python不是你想要的,这个时候就需要对Python的默认版本进行修改. 在Windows中,可以通过修改环境变量的 ...
- python 基础之注释变量常量
一:注释 注释: 就是对代码的解释 方便大家阅读代码 1.注释的分类 (1)单行注释 # 在python中在行首添加一个#号就将这一行进行注释 #单行注释: 用#开头,后面跟上任意字符串 #pyth ...
- 孤荷凌寒自学python第五十三天使用python写入和修改Firebase数据库中记录
孤荷凌寒自学python第五十三天使用python写入和修改Firebase数据库中记录 (完整学习过程屏幕记录视频地址在文末) 今天继续研究Firebase数据库,利用google免费提供的这个数 ...
- python requests接收chunked编码问题-python源码修改
python requests接收chunked编码问题-python源码修改 学习了:https://blog.csdn.net/wangzuxi/article/details/40377467
- Python的字符串修改报错:TypeError: 'str' object does not support item assignment
Python中想修改字符串的最后一个字符,使用name[-1] = 'e'来实现,运行后报错. 报错内容是:TypeError: 'str' object does not support item ...
- python禁止函数修改列表的实现方法
python禁止函数修改列表的实现方法 有时候,需要禁止函数修改列表.例如要对裂变进行修改操作,也要保留原来的未打印的设计列表,以供备案.为解决这个问题,可向函数传递列表的副本而不是原件:这样函数所做 ...
随机推荐
- GitPython git python 的开发库
工程地址: https://pypi.python.org/pypi/GitPython/需要安装先安装: gitdb https://pypi.python.org/pypi/gitdb GitPy ...
- ubuntu10.04共享文件夹
ubuntu10.04共享文件夹 参考http://jingyan.baidu.com/album/9989c746084c70f648ecfe99.html,共享了home文件夹,然后把共享文件夹映 ...
- Entity Framework Architecture
http://www.entityframeworktutorial.net/EntityFramework-Architecture.aspx The following figure shows ...
- 观察者模式最佳案例实现[JAVA][原创]
/** * American Stock Exchange market(ASE) has a list of stocks.A stock object has two perspective in ...
- git workflow常用命令
git init git status git add readme.txt git add --all Adds all new or modified files git comm ...
- bzoj4127
肯定是树链剖分+线段树,关键是怎么维护 绝对值和这个东西显然不能简单的合并标记 因为对于负数,加之后绝对值和是变小的 那我们考虑对负数和非负数数分别维护 下面的问题就是经过操作如果负数变成了正数怎么办 ...
- VS2015新功能
今天有幸参加了微软的 Visual Studio Dev Day,趁还没有忘记今天的学习内容. 先把这些内容记录下来,如果有其他人也参加此次交流活动,请补充完善. VS2015新功能 1,Roslyn ...
- UVa 548 (二叉树的递归遍历) Tree
题意: 给出一棵由中序遍历和后序遍历确定的点带权的二叉树.然后找出一个根节点到叶子节点权值之和最小(如果相等选叶子节点权值最小的),输出最佳方案的叶子节点的权值. 二叉树有三种递归的遍历方式: 先序遍 ...
- HDFS 整体把握
对于HDFS这样一个分布式文件系统,它的目的是为了实现在多台廉价X86服务器上实现大文件存储. HDFS 是仿造GFS 设计出来的. 如图所示, 这种实现方案是一种采取有一个中心节点, 多个数 ...
- 定时组件quartz系列<一>模拟定时组件小程序
一.核心概念 Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可. 1.Job表示一个工作,要执行的具体内容.此接口中只有一个方法void execute(Jo ...