博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 定义自己的常量类
阅读量:4546 次
发布时间:2019-06-08

本文共 1470 字,大约阅读时间需要 4 分钟。

在实际的程序开发中,我们通常会将一个不可变的变量声明为一个常量。在很多高级语言中都会提供常量的关键字来定义常量,如 C++ 中的 constJava 中的 final 等,但是 Python 语言因为变量无类型,所以也就不存在这样的修饰符,其本身并未提供任何机制来进行常量的定义。因此我们只能通过自己定义类的方法来定义一个符合常量规则的类,使得该类定义的成员属性满足常量的属性。常量一般符合以下两条规则:

  1. 常量的各个字母使用大写字母表示,中间以下划线连接:如 MAX_VALUE;
  2. 常量的值一旦绑定则不可以再修改。

由于常量的值一旦绑定则不可再修改,所以也就是说对常量二次赋值时需要抛出异常。因此我们显然需要改写自定义的常量类的赋值方法。在 Python 中,当我们对类的属性进行赋值时,会自动调用 object 类的 __setattr__() 函数,该函数的定义如下:

object.__setattr__(self, name, value)

其中的 name 表示属性的名称,value 是试图赋值给 name 的值,其中 object 类的 object.__dict__ 以字典的形式保存了所有已赋值的属性。

因此我们可以通过定义一个常量类 constant 类(默认继承自object),并对 object.__setattr__() 方法进行重写。由于常量有两条规则,所以我们需要根据这两条规则自定义两个异常处理,分别是二次赋值的异常处理和名称非大写的异常处理。

异常处理的定义方式请参看:

定义常量类:

constant.py

import sysclass _const:    # 自定义异常处理    class ConstError(PermissionError):        pass    class ConstCaseError(ConstError):        pass    # 重写 __setattr__() 方法    def __setattr__(self, name, value):        if name in self.__dict__:  # 已包含该常量,不能二次赋值            raise self.ConstError("Can't change const {0}".format(name))        if not name.isupper():  # 所有的字母需要大写            raise self.ConstCaseError("const name {0} is not all uppercase".format(name))        self.__dict__[name] = value# 将系统加载的模块列表中的 constant 替换为 _const() 实例sys.modules[__name__] = _const()

在其它文件中定义常量,test.py

import constantconstant.VALUE = 5constant.VALUE = 4  # ConstErrorconstant.vaLue = 1  # ConstCaseError

当我们识图修改常量 VALUE 的值或者定义一个名称不是全部大写的常量时,都会抛出异常,这样就达到了不可更改常量的值的目的。

转载于:https://www.cnblogs.com/ydcode/p/10996791.html

你可能感兴趣的文章
常用居中方法记录
查看>>
JS如何判断是不是iphoneX
查看>>
矩阵乘法
查看>>
WEB ICON 的探讨
查看>>
关于.Net中的反射使用入门
查看>>
[内核编程] 键盘过滤第一个例子ctrl2cap(4.1~4.4)汇总,测试
查看>>
<转>Spring Test 整合 JUnit 4 使用总结
查看>>
Java读书笔记05 类与对象
查看>>
正则表达式语法 2
查看>>
c# winform 应用程序根据条件阻止窗口关闭
查看>>
转载:简单的php写入数据库类
查看>>
垂直居中的几种实现方法
查看>>
UILabel标签文字过长时的显示方式
查看>>
H5离线缓存机制-manifest
查看>>
[学习笔记]BSGS
查看>>
NHibernate 01 [简述]
查看>>
EL表达式浅析以及使用场景
查看>>
Android数据库高手秘籍(一)——SQLite命令
查看>>
[Oracle] 分析功能(1)- 语法
查看>>
Android ViewPager使用具体解释
查看>>