У Python действительно нет окончательного типа, у него есть неизменяемые типы, такие как кортежи, но это нечто другое.
Некоторые другие ответы здесь делают классы полными псевдо-финальными переменными, и я предпочитаю, чтобы в моем классе было только несколько типов Final, поэтому я предлагаю использовать дескриптор для создания финального типа:
from typing import TypeVar, Generic, Type
T = TypeVar('T')
class FinalProperty(Generic[T]):
def __init__(self, value: T):
self.__value = value
def __get__(self, instance: Type, owner) -> T:
return self.__value
def __set__(self, instance: Type, value: T) -> None:
raise ValueError("Final types can't be set")
Если вы используете этот класс так:
class SomeJob:
FAILED = FinalProperty[str]("Failed")
Тогда вы не сможете установить эту переменную ни в одном экземпляре этого класса.
К сожалению, как и в случае ответа WriteOnceReadWhenever, вы все равно можете установить переменную класса.
job = SomeJob()
job.FAILED = "Error, this will trigger the ValueError"
SomeJob.FAILED = "However this still works and breaks the protection afterwards"