python中的常量可以修改吗_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] =valueimportsys
sys.modules[__name__] = _const()
其中,1-10行是上述思路的类的一个实现。
第12-14行的写法值得说明。我们尽管拥有了_const类,但是我们当前使用这个类仍然需要
importconst
c=const._const()
c.TEST_CONSTANT= 'test'
这样的形式来声明一个常量TEST_CONSTANT,然而我们希望用更简洁的方法进行常量的赋值。形如:
importconst
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行的写法等价于
importconst
sys.modules['const'] = _const()
即,让_const类作为模块的入口点,引入const.py等价于声明了一个_const类的实例。
至此python的常量实现完毕,使用test.py测试:
#-*- coding: utf-8 -*-
importconst
const.TEST= 'test'
printconst.TEST
const.TEST1= 'test1'
printconst.TEST1
const.TEST= 'test'
print const.TEST
打印信息如下:
test
test1
Traceback (most recent call last):
File "H:/code/test.py", line 9, in
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中声明变量注意要项_Python之变量、常量以及注释
Python之变量.常量以及注释 一.什么是变量 变量,是用于在内存中存放程序数据的容器,怎么理解呢? 计算机的最核心的功能就是"计算",计算需要数据源,数据源存在在内存里,比如我 ...
- python中math.ceil是什么意思_python中的数字取整(ceil,floor,round)概念和用法
python中的数学运算函数(ceil,floor,round)的主要任务是截掉小数以后的位数.总体来说 就是取整用的.只是三者之间有微妙的区别: floor() :把数字变小 ceil() : 把数 ...
- 在python中len表示的数据类型是_python基本数据类型学习
python是极其简洁的一门高级语言,在python里面没有真正意义上的常量,只是用大写的标定表示常量(python中的常量是可以修改的),单行注释用#开始,.并且python不用定义数据类型,因为p ...
- python中int是什么的缩写_python中int是什么类型
python中的基本数据类型 1:虽然python中的变量不需要声明,但使用时必须赋值 整形变量 浮点型变量 字符型 2:可以一个给多个变量赋值,也可以多个给多个变量赋值 3:python3中有6个标 ...
- python中find是什么意思啊_python中str的find()
今天学习语法的时候发现字符串自带函数find和操作符in功能十分近似,几乎一模一样 if'a'inname: print'Yes, it contains the string "a&quo ...
- python中int表示的数据类型是_python中的基本数据类型之 int bool str
一.基本数据类型 1. int ==> 整数.主要用来进行数学运算. 2.str ==> 字符串.可以保存少量的数据,并进行相应的操作. 3.bool => 布尔值.判断 ...
- python中如何创建类的对象_python面向对象中如何建立具体的对象?
我们现在眼前所能看到的事物,都是具体的对象.很多小伙伴在面向对象中创建对象,其实都停留在对象名称的建立,计算机中并没有具体对象的描述属性.我们想要使用python中的类,建立的对象就需要是具体的.下面 ...
- python中读写excel的扩展库_Python读写Excel文件第三方库汇总,你想要的都在这儿!...
常见库简介 xlrd xlrd是一个从Excel文件读取数据和格式化信息的库,支持.xls以及.xlsx文件. http://xlrd.readthedocs.io/en/latest/ 1.xlrd ...
- python中标识符下划线用作开头_python python中那些双下划线开头的那些函数都是干啥用用的...
1.写在前面 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义. 其实如果足 ...
最新文章
- 揭秘人工智能背后鲜为人知的人工力量——数据标注
- 让你分分钟明白onTouchEvent事件分发
- YOLO3实现目标检测(VS2015+OPENCV3.4.2+YOLO3+CUDA10.0+CUDNN7.5)
- 2020年7月程序员工资统计,平均14357元,又跌了,扎心
- wxWidgets:wxRegEx类用法
- Qt Creator指定项目属性
- matlab app designer制作软件_gif制作软件app
- 射命丸文 (Standard IO)
- Java小项目:图片版坦克大战
- android 自定义相机,Android应用开发之android 7自定义相机预览及拍照功能
- qq修改群名服务器失败,如何解决qq群名片改不了的问题
- 去除PreferenceScreen过期提示
- 高通SDX12:USB主模式调试及RTL8153驱动移植
- iphonex屏幕尺寸html,三分钟弄懂iPhone X 设计尺寸和适配
- python自动提交网页表单_Python 自动化表单提交实例代码
- 应用,传输层协议和端口对应关系
- Java学习笔记Day2:流程控制
- 如何搭建去中心化商城系统案例分析
- XYNUOJ Six Degrees of Separation
- FILEminimizer Office,FILEminimizer Suite和FILEminimizer Server常见问题FAQ合集(一)
热门文章
- 如何校验内存数据的一致性,DynamicExpresso 算是帮上大忙了
- 一文说通C#中的异步编程补遗
- 软硬件协同编程 - C#玩转CPU高速缓存(附示例)
- C# WPF抽屉效果实现
- C# 8.0 中开启默认接口实现
- 一份来自28岁.NET老程序员的自白
- .NET Core2使用Azure云上的Iot-Hub服务
- 使用 C# 代码实现拓扑排序
- Orchard Core一分钟搭建ASP.NET Core CMS
- ABP从入门到精通(1):aspnet-zero-core项目启动及各项目源码说明