如何在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
相关产品推荐
相关产品推荐

