因为种种原因,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实现不可修改的常量相关推荐

  1. python中声明变量注意要项_Python之变量、常量以及注释

    Python之变量.常量以及注释 一.什么是变量 变量,是用于在内存中存放程序数据的容器,怎么理解呢? 计算机的最核心的功能就是"计算",计算需要数据源,数据源存在在内存里,比如我 ...

  2. python中math.ceil是什么意思_python中的数字取整(ceil,floor,round)概念和用法

    python中的数学运算函数(ceil,floor,round)的主要任务是截掉小数以后的位数.总体来说 就是取整用的.只是三者之间有微妙的区别: floor() :把数字变小 ceil() : 把数 ...

  3. 在python中len表示的数据类型是_python基本数据类型学习

    python是极其简洁的一门高级语言,在python里面没有真正意义上的常量,只是用大写的标定表示常量(python中的常量是可以修改的),单行注释用#开始,.并且python不用定义数据类型,因为p ...

  4. python中int是什么的缩写_python中int是什么类型

    python中的基本数据类型 1:虽然python中的变量不需要声明,但使用时必须赋值 整形变量 浮点型变量 字符型 2:可以一个给多个变量赋值,也可以多个给多个变量赋值 3:python3中有6个标 ...

  5. python中find是什么意思啊_python中str的find()

    今天学习语法的时候发现字符串自带函数find和操作符in功能十分近似,几乎一模一样 if'a'inname: print'Yes, it contains the string "a&quo ...

  6. python中int表示的数据类型是_python中的基本数据类型之 int bool str

    一.基本数据类型 1. int  ==>  整数.主要用来进行数学运算. 2.str  ==>  字符串.可以保存少量的数据,并进行相应的操作. 3.bool  =>  布尔值.判断 ...

  7. python中如何创建类的对象_python面向对象中如何建立具体的对象?

    我们现在眼前所能看到的事物,都是具体的对象.很多小伙伴在面向对象中创建对象,其实都停留在对象名称的建立,计算机中并没有具体对象的描述属性.我们想要使用python中的类,建立的对象就需要是具体的.下面 ...

  8. python中读写excel的扩展库_Python读写Excel文件第三方库汇总,你想要的都在这儿!...

    常见库简介 xlrd xlrd是一个从Excel文件读取数据和格式化信息的库,支持.xls以及.xlsx文件. http://xlrd.readthedocs.io/en/latest/ 1.xlrd ...

  9. python中标识符下划线用作开头_python python中那些双下划线开头的那些函数都是干啥用用的...

    1.写在前面 今天遇到了__slots__,,所以我就想了解下python中那些双下划线开头的那些函数都是干啥用用的,翻到了下面这篇博客,看着很全面,我只了解其中的一部分,还不敢乱下定义. 其实如果足 ...

最新文章

  1. 揭秘人工智能背后鲜为人知的人工力量——数据标注
  2. 让你分分钟明白onTouchEvent事件分发
  3. YOLO3实现目标检测(VS2015+OPENCV3.4.2+YOLO3+CUDA10.0+CUDNN7.5)
  4. 2020年7月程序员工资统计,平均14357元,又跌了,扎心
  5. wxWidgets:wxRegEx类用法
  6. Qt Creator指定项目属性
  7. matlab app designer制作软件_gif制作软件app
  8. 射命丸文 (Standard IO)
  9. Java小项目:图片版坦克大战
  10. android 自定义相机,Android应用开发之android 7自定义相机预览及拍照功能
  11. qq修改群名服务器失败,如何解决qq群名片改不了的问题
  12. 去除PreferenceScreen过期提示
  13. 高通SDX12:USB主模式调试及RTL8153驱动移植
  14. iphonex屏幕尺寸html,三分钟弄懂iPhone X 设计尺寸和适配
  15. python自动提交网页表单_Python 自动化表单提交实例代码
  16. 应用,传输层协议和端口对应关系
  17. Java学习笔记Day2:流程控制
  18. 如何搭建去中心化商城系统案例分析
  19. XYNUOJ Six Degrees of Separation
  20. FILEminimizer Office,FILEminimizer Suite和FILEminimizer Server常见问题FAQ合集(一)

热门文章

  1. 如何校验内存数据的一致性,DynamicExpresso 算是帮上大忙了
  2. 一文说通C#中的异步编程补遗
  3. 软硬件协同编程 - C#玩转CPU高速缓存(附示例)
  4. C# WPF抽屉效果实现
  5. C# 8.0 中开启默认接口实现
  6. 一份来自28岁.NET老程序员的自白
  7. .NET Core2使用Azure云上的Iot-Hub服务
  8. 使用 C# 代码实现拓扑排序
  9. Orchard Core一分钟搭建ASP.NET Core CMS
  10. ABP从入门到精通(1):aspnet-zero-core项目启动及各项目源码说明