python关键字定义常量_定义常量

Python语言没有内置的常量定义方式,但可以通过全大写字母的变量名约定来表示常量。然而,这种方式并不能阻止值的改变。文章介绍了如何通过自定义类来实现真正的常量,重写`__setattr__()`方法以防止二次赋值,并在尝试修改或创建非大写名称的常量时抛出异常。这种方式确保了常量的不可变性和命名规范。
摘要由CSDN通过智能技术生成

## python常量

在实际的程序开发中,我们通常会将一个不可变的变量声明为一个常量。在很多高级语言中都会提供常量的关键字来定义常量,如`C++`中的`const`,`Java`中的`final`等,但是`Python`语言因为变量无类型,所以也就不存在这样的修饰符,其本身并未提供任何机制来进行常量的定义。

python程序一般通过约定俗成的变量名全大写的形式表示这是一个常量,然而这种方式并没有真正实现常量,其对应的值仍然可以被改变。后来python提供了新的方法实现常量:即通过自定义类实现常量。这要求符合“命名全部为大写”和“值一旦被绑定便不可再修改”这两个条件。因此我们只能通过自己定义类的方法来定义一个符合常量规则的类,使得该类定义的成员属性满足常量的属性。

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

~~~

object.__setattr__(self, name, value)

~~~

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

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

## 定义常量类

[constant.py](http://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](http://test.py)

~~~

import constant

constant.VALUE = 5

constant.VALUE = 4 # ConstError

constant.vaLue = 1 # ConstCaseError

~~~

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值