Python 定义自己的常量类
程序员文章站
2022-03-22 12:09:46
在实际的程序开发中,我们通常会将一个不可变的变量声明为一个常量。在很多高级语言中都会提供常量的关键字来定义常量,如 中的 , 中的 等,但是 语言因为变量无类型,所以也就不存在这样的修饰符,其本身并未提供任何机制来进行常量的定义。因此我们只能通过自己定义类的方法来定义一个符合常量规则的类,使得该类定 ......
在实际的程序开发中,我们通常会将一个不可变的变量声明为一个常量。在很多高级语言中都会提供常量的关键字来定义常量,如 c++
中的 const
, java
中的 final
等,但是 python
语言因为变量无类型,所以也就不存在这样的修饰符,其本身并未提供任何机制来进行常量的定义。因此我们只能通过自己定义类的方法来定义一个符合常量规则的类,使得该类定义的成员属性满足常量的属性。常量一般符合以下两条规则:
- 常量的各个字母使用大写字母表示,中间以下划线连接:如
max_value
;- 常量的值一旦绑定则不可以再修改。
由于常量的值一旦绑定则不可再修改,所以也就是说对常量二次赋值时需要抛出异常。因此我们显然需要改写自定义的常量类的赋值方法。在 python
中,当我们对类的属性进行赋值时,会自动调用 object
类的 __setattr__()
函数,该函数的定义如下:
object.__setattr__(self, name, value)
其中的 name
表示属性的名称,value
是试图赋值给 name
的值,其中 object
类的 object.__dict__
以字典的形式保存了所有已赋值的属性。
因此我们可以通过定义一个常量类 constant
类(默认继承自object
),并对 object.__setattr__()
方法进行重写。由于常量有两条规则,所以我们需要根据这两条规则自定义两个异常处理,分别是二次赋值的异常处理和名称非大写的异常处理。
异常处理的定义方式请参看:python 错误和异常
定义常量类:
constant.py
import sys class _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 constant constant.value = 5 constant.value = 4 # consterror constant.value = 1 # constcaseerror
当我们识图修改常量 value
的值或者定义一个名称不是全部大写的常量时,都会抛出异常,这样就达到了不可更改常量的值的目的。