Python 定义本身的常量类

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

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

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

object.__setattr__(self, name, value)

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

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

异常处理的定义方式请参看:Python 错误和异常orm

定义常量类:

constant.pyhtm

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 的值或者定义一个名称不是所有大写的常量时,都会抛出异常,这样就达到了不可更改常量的值的目的。开发

相关文章
相关标签/搜索