文章目录深入理解 Python typing.Final1 什么是 Final2 Final 的两种主要用途3 用法一声明常量为什么不用普通变量4 用法二防止子类重写5 Final 与常量命名规范的区别6 类属性中的 Final7 Final 与实例变量8 Final 不会在运行时生效9 Final 的典型使用场景1 配置常量2 API 版本3 HTTP 状态码4 不希望被子类修改的属性10 最佳实践1 常量同时使用 Final 大写2 用于不应该改变的配置3 在大型项目中使用结语下面是一篇可直接发布的技术博文草稿面向有一定 Python 基础、希望深入理解类型系统的读者。深入理解 Pythontyping.Final在使用 Python 编写大型项目时我们经常希望某些变量只被赋值一次或者某些方法不允许在子类中被重写。Python 的typing模块提供了一个重要工具Final。本文将介绍Final是什么Final的两种核心用途常见使用场景与常量的区别实际项目中的最佳实践1 什么是FinalFinal是 Python 类型系统中的一个类型限定符type qualifier用于告诉类型检查器这个变量或属性不应该被重新赋值或被子类覆盖。它最早在PEP 591中被提出并在Python 3.8中正式加入typing模块。需要注意Final不会在运行时强制限制它只对类型检查工具例如mypy、pyright生效示例fromtypingimportFinal API_VERSION:Finalv1这意味着API_VERSION应该只赋值一次之后不应该再修改2Final的两种主要用途Final主要有两个核心用途1️⃣ 声明常量2️⃣ 防止子类重写属性3 用法一声明常量这是Final最常见的使用方式。fromtypingimportFinal MAX_CONNECTIONS:Final10如果之后写MAX_CONNECTIONS20类型检查工具会报错Cannot assign to final name MAX_CONNECTIONS为什么不用普通变量传统写法MAX_CONNECTIONS10Python 并不会阻止MAX_CONNECTIONS20使用Final后类型检查器就能帮助发现问题。4 用法二防止子类重写Final还可以用于类属性防止子类修改。示例fromtypingimportFinalclassBaseConfig:VERSION:Final1.0子类中如果尝试classDevConfig(BaseConfig):VERSION2.0类型检查器会提示Cannot override final attribute VERSION5Final与常量命名规范的区别在 Python 中传统的“常量”只是命名约定API_URLhttps://api.example.com全大写只是告诉开发者“请不要修改它”但语言本身不会限制。而Final提供的是方式是否强制类型检查命名规范否否Final否运行时是静态检查因此最佳实践是同时使用两者API_URL:Finalhttps://api.example.com6 类属性中的Final一个常见场景是类常量fromtypingimportFinalclassHttpStatus:OK:Final200NOT_FOUND:Final404这样这些值不会被意外修改子类也不会覆盖7Final与实例变量Final也可以用于实例属性fromtypingimportFinalclassUser:id:Final[int]def__init__(self,id:int):self.idid这里表示id只能在__init__中赋值之后不应该再修改例如user.id5类型检查器会报错。8Final不会在运行时生效这是很多人容易误解的一点。即使写了API_VERSION:Finalv1API_VERSIONv2Python仍然可以运行。Final只是帮助mypypyrightIDE如 PyCharm、VSCode进行静态分析。9Final的典型使用场景在真实项目中Final常见于1 配置常量TIMEOUT:Final302 API 版本API_VERSION:Finalv13 HTTP 状态码classStatus:OK:Final2004 不希望被子类修改的属性classBaseService:NAME:Finalbase10 最佳实践推荐的实践方式1 常量同时使用Final 大写DATABASE_URL:Finalpostgres://...2 用于不应该改变的配置例如端口API 版本默认路径3 在大型项目中使用Final在以下情况下最有价值团队协作项目大型代码库公共库 API结语Final虽然只是 Python 类型系统中的一个小特性但在提高代码可维护性和可读性方面非常有价值。总结Final用于声明不可重新赋值的变量可以防止子类覆盖属性只在静态类型检查阶段生效推荐与常量命名规范一起使用如果你的项目已经开始使用类型检查工具那么Final是一个非常值得引入的工具。
Python typing Final(类型限定符type qualifier,用于告诉类型检查器:这个变量或属性不应该被重新赋值或被子类覆盖)声明常量、防止子类重写、全大写、实例属性
文章目录深入理解 Python typing.Final1 什么是 Final2 Final 的两种主要用途3 用法一声明常量为什么不用普通变量4 用法二防止子类重写5 Final 与常量命名规范的区别6 类属性中的 Final7 Final 与实例变量8 Final 不会在运行时生效9 Final 的典型使用场景1 配置常量2 API 版本3 HTTP 状态码4 不希望被子类修改的属性10 最佳实践1 常量同时使用 Final 大写2 用于不应该改变的配置3 在大型项目中使用结语下面是一篇可直接发布的技术博文草稿面向有一定 Python 基础、希望深入理解类型系统的读者。深入理解 Pythontyping.Final在使用 Python 编写大型项目时我们经常希望某些变量只被赋值一次或者某些方法不允许在子类中被重写。Python 的typing模块提供了一个重要工具Final。本文将介绍Final是什么Final的两种核心用途常见使用场景与常量的区别实际项目中的最佳实践1 什么是FinalFinal是 Python 类型系统中的一个类型限定符type qualifier用于告诉类型检查器这个变量或属性不应该被重新赋值或被子类覆盖。它最早在PEP 591中被提出并在Python 3.8中正式加入typing模块。需要注意Final不会在运行时强制限制它只对类型检查工具例如mypy、pyright生效示例fromtypingimportFinal API_VERSION:Finalv1这意味着API_VERSION应该只赋值一次之后不应该再修改2Final的两种主要用途Final主要有两个核心用途1️⃣ 声明常量2️⃣ 防止子类重写属性3 用法一声明常量这是Final最常见的使用方式。fromtypingimportFinal MAX_CONNECTIONS:Final10如果之后写MAX_CONNECTIONS20类型检查工具会报错Cannot assign to final name MAX_CONNECTIONS为什么不用普通变量传统写法MAX_CONNECTIONS10Python 并不会阻止MAX_CONNECTIONS20使用Final后类型检查器就能帮助发现问题。4 用法二防止子类重写Final还可以用于类属性防止子类修改。示例fromtypingimportFinalclassBaseConfig:VERSION:Final1.0子类中如果尝试classDevConfig(BaseConfig):VERSION2.0类型检查器会提示Cannot override final attribute VERSION5Final与常量命名规范的区别在 Python 中传统的“常量”只是命名约定API_URLhttps://api.example.com全大写只是告诉开发者“请不要修改它”但语言本身不会限制。而Final提供的是方式是否强制类型检查命名规范否否Final否运行时是静态检查因此最佳实践是同时使用两者API_URL:Finalhttps://api.example.com6 类属性中的Final一个常见场景是类常量fromtypingimportFinalclassHttpStatus:OK:Final200NOT_FOUND:Final404这样这些值不会被意外修改子类也不会覆盖7Final与实例变量Final也可以用于实例属性fromtypingimportFinalclassUser:id:Final[int]def__init__(self,id:int):self.idid这里表示id只能在__init__中赋值之后不应该再修改例如user.id5类型检查器会报错。8Final不会在运行时生效这是很多人容易误解的一点。即使写了API_VERSION:Finalv1API_VERSIONv2Python仍然可以运行。Final只是帮助mypypyrightIDE如 PyCharm、VSCode进行静态分析。9Final的典型使用场景在真实项目中Final常见于1 配置常量TIMEOUT:Final302 API 版本API_VERSION:Finalv13 HTTP 状态码classStatus:OK:Final2004 不希望被子类修改的属性classBaseService:NAME:Finalbase10 最佳实践推荐的实践方式1 常量同时使用Final 大写DATABASE_URL:Finalpostgres://...2 用于不应该改变的配置例如端口API 版本默认路径3 在大型项目中使用Final在以下情况下最有价值团队协作项目大型代码库公共库 API结语Final虽然只是 Python 类型系统中的一个小特性但在提高代码可维护性和可读性方面非常有价值。总结Final用于声明不可重新赋值的变量可以防止子类覆盖属性只在静态类型检查阶段生效推荐与常量命名规范一起使用如果你的项目已经开始使用类型检查工具那么Final是一个非常值得引入的工具。