0

0

Python 常量实现方式与实际约束

冷炫風刃

冷炫風刃

发布时间:2026-01-29 18:19:09

|

240人浏览过

|

来源于php中文网

原创

Python无语言级常量,const/final等关键字不被支持;所谓常量仅靠全大写命名约定,运行时可随意重赋值;typing.Final仅在静态类型检查时提示错误,运行时无效;可通过__slots__+@property实现运行时只读实例属性;enum适合定义有限互斥状态,不适用于标量常量;生产环境应优先用测试保障常量不变性。

python 常量实现方式与实际约束

Python 没有语言级常量,const 不存在

Python 解释器不支持 constfinal 或类似关键字声明不可变绑定。所谓“常量”只是约定俗成的命名惯例(如全大写 MAX_RETRY),解释器完全允许你重新赋值:MAX_RETRY = 5 之后再写 MAX_RETRY = 10 不会报错,也不会警告。

这种设计源于 Python 的动态性哲学——名字只是对象的标签,绑定可随时更改。想靠语法强制阻止修改,做不到。

typing.Final 做类型检查层面的约束

typing.Final 是唯一接近“常量语义”的标准方案,但它只在静态类型检查时起作用(如 mypy),运行时不生效:

from typing import Final

PI: Final[float] = 3.14159 PI = 3.14 # mypy 报错:Cannot assign to final attribute "PI"

  • 必须配合类型检查工具使用,python script.py 直接运行完全无视 Final
  • 仅对模块级变量有效;类属性上用 Final 需搭配 @final 类装饰器(Python 3.12+)才更严谨
  • 不能防止对可变对象内容的修改,例如 LIST: Final = [1, 2] 后仍可执行 LIST.append(3)

__slots__ + 只读属性模拟不可变实例常量

若需在类中封装一组运行时不可变的值(比如配置项),可结合 __slots__@property 实现真正只读的实例属性:

立即学习Python免费学习笔记(深入)”;

class Config:
    __slots__ = ("_host", "_port")
def __init__(self, host: str, port: int):
    self._host = host
    self._port = port

@property
def host(self) -> str:
    return self._host

@property
def port(self) -> int:
    return self._port

cfg = Config("localhost", 8000)

动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版
动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版

动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包

下载

cfg.host = "new" # AttributeError: can't set attribute

  • __slots__ 禁止动态添加属性,减少内存占用并提前暴露非法赋值
  • @property 去掉 setter 即实现运行时只读,比 Final 更实在
  • 注意:仍无法阻止通过 object.__setattr__(cfg, "_host", "hacked") 绕过,但已覆盖绝大多数误用场景

第三方方案如 constantlyenum.Enum 的适用边界

enum.Enum 适合定义一组互斥、有限、带名称的固定值(如状态码 Status.ACTIVE),但它不是通用常量容器——每个成员是独立对象,不能直接用于数学运算或字符串拼接,且不支持 float/int 字面子类化(除非用 IntEnum)。

constantly 这类库本质是封装了带 __set__ 魔法方法的描述符,能拦截赋值,但会引入额外依赖,且可能与某些框架(如 Pydantic v2 的模型字段)产生冲突。

  • 优先用 enum 表达“选择集”,不用来替代 API_TIMEOUT = 30 这类标量常量
  • 生产环境慎用描述符型常量库,调试时容易卡在 __set__ 里,且 IDE 支持弱于 Final
  • 真正的硬性约束只能靠测试覆盖:在 CI 中加断言验证关键常量未被意外重赋值

最易被忽略的一点:所谓“常量”的生命周期和作用域常常比想象中更短。模块级全大写变量在热重载、多线程导入、或被 importlib.reload() 干扰时,行为并不稳定。如果逻辑真依赖不可变性,别省那几行 @property

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

579

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

102

2025.10.23

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1502

2023.10.24

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

531

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1502

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

624

2023.11.24

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

1

2026.01.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 22.4万人学习

Django 教程
Django 教程

共28课时 | 3.7万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号