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禁止函数修改列表的实现方法 有时候,需要禁止函数修改列表.例如要对裂变进行修改操作,也要保留原来的未打印的设计列表,以供备案.为解决这个问题,可向函数传递列表的副本而不是原件:这样函数所做 ...
随机推荐
- 《Linux内核设计与实现》读书笔记(七)- 中断处理【转】
转自:http://www.cnblogs.com/wang_yb/archive/2013/04/19/3030345.html 中断处理一般不是纯软件来实现的,需要硬件的支持.通过对中断的学习有助 ...
- dojo 七 DOM dojo/dom
官方教程:Dojo DOM Functions对dom的使用,需要引用包dojo/dom.1.获取节点,dom.byIdbyId中既可以传递一个字符串,也可以传递一个节点对象 require([&qu ...
- 基于Linux的oracle数据库管理 part3( 存储 网络 常用命令 )
主要内容 1. 常用存储模式 2. 配置网络 3. 维护指令 常用存储模式 - 文件系统 优点:管理方便, 缺点:读写慢 - 裸设备 只没有被格式化和挂载的磁盘, 只能有程序直接访问, 不能被操作系统 ...
- cocos2dx 坐标系 -转
(原文出处找不到了) 无论是搞2d还是3d开发,最需要搞清楚的就是坐标系,这部分混乱的话就没啥奔头了.所以玩cocos2d,一上来就先把各种与坐标有关的东西搞清楚. 基本的两个坐标系:屏幕坐标系和GL ...
- 函数mem_pool_create
/********************************************************************//** Creates a memory pool. @re ...
- mac terminal 命令
mac下显示隐藏文件 显示 defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏 defaults write com.app ...
- 将js对象转为json对象属性加上引号
工具地址 http://js2json.mengxiangchaoren.com
- HDU 1564 (博弈) Play a game
这道题的答案猜也很好猜出来,但是想太难想了..题解一贴,然后闪人.. 请戳这
- HDU 5268 ZYB loves Score (简单模拟,水)
题意:计算Bestcoder四题的得分. 思路:直接模拟,4项分数直接计算后输出.注意不要低于百分之40的分. //#include <bits/stdc++.h> #include &l ...
- 08day1
高中运动会 最大公约数 [问题描述] 梦幻城市每年为全市高中生兴办一次运动会.为促使各校同学之间的交流,采用特别的分队方式:每一个学校的同学,必须被均匀分散到各队,使得每一队中该校的人数皆相同.为增加 ...