You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中实现真正不可修改的常量?

在Python中实现不可修改常量的最佳方式

Python本身没有原生的常量关键字,但可以通过几种方式实现近似"真正常量"的效果,以下是几种常用且符合Python风格的方案:

1. 重写类的__setattr__方法

直接在常量类中重写类级和实例级的__setattr__方法,阻止属性修改并抛出异常:

class Constants:
    PI = 3.14159
    GRAVITY = 9.8

    # 阻止实例属性修改
    def __setattr__(self, name, value):
        raise TypeError("Constants cannot be modified")

    # 阻止类属性修改
    @classmethod
    def __setattr__(cls, name, value):
        raise TypeError(f"Cannot modify constant '{name}'")

尝试修改类属性或实例属性时,会直接抛出TypeError:

Constants.PI = 3  # 触发 TypeError: Cannot modify constant 'PI'
const_instance = Constants()
const_instance.GRAVITY = 10  # 触发 TypeError: Constants cannot be modified

2. 使用元类(Metaclass)实现可复用的常量规则

如果需要多个类都遵循"不可修改常量"的规则,元类是更高效的复用方案:

class ConstantMeta(type):
    def __setattr__(cls, name, value):
        # 仅阻止已存在的常量被修改,允许新增常量(如果不需要新增可去掉判断)
        if name in cls.__dict__:
            raise TypeError(f"Cannot reassign constant '{name}'")
        super().__setattr__(name, value)

# 继承元类创建常量类
class Constants(metaclass=ConstantMeta):
    PI = 3.14159
    GRAVITY = 9.8

这个方案的优势在于,所有使用ConstantMeta元类的类都会自动拥有不可修改的特性,无需重复编写__setattr__逻辑。

3. 使用enum.Enum定义语义化常量

Python标准库的enum模块是官方推荐的枚举常量实现方式,枚举成员默认不可修改,且语义清晰:

from enum import Enum

class Constants(Enum):
    PI = 3.14159
    GRAVITY = 9.8

# 获取常量值需要使用 .value 属性
print(Constants.PI.value)  # 输出 3.14159

尝试修改枚举成员会直接抛出AttributeError:

Constants.PI = 3  # 触发 AttributeError: Cannot reassign members.

最佳实践总结

  • 若只是简单的常量集合,优先选择重写__setattr__的类方法方案,实现简单直观;
  • 若需要多个常量类复用不可修改规则,使用元类方案更高效;
  • 若常量是一组具有明确业务语义的枚举值,优先使用**enum.Enum**,这是最符合Python风格的官方解决方案。

内容的提问来源于stack exchange,提问作者Anuraj_R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 13:55:06