Однако‚ существует ситуация‚ когда мы хотим указать‚ что переменная не должна изменяться после инициализации. В таких случаях‚ мы можем использовать аннотацию типа `typing.Final`.Давайте рассмотрим пример. Представьте‚ что у нас есть класс `Person`‚ содержащий имя и возраст⁚
python
class Person⁚
def __init__(self‚ name⁚ str‚ age⁚ int)⁚
self.name name
self.age age
Теперь представьте‚ что мы хотим указать‚ что поле `name` является неизменным после инициализации. Мы можем использовать `typing.Final` для этого⁚
python
from typing import Final
class Person⁚
def __init__(self‚ name⁚ Final[str]‚ age⁚ int)⁚
self.name name
self.age age
Теперь‚ после инициализации‚ поле `name` не может быть изменено. Если мы попытаемся сделать это‚ мы получим ошибку типа⁚
python
person Person(″Alice″‚ 25)
person.name ″Bob″ # Ошибка⁚ can’t assign to final name ‘name’
Это может быть очень полезным в ситуациях‚ когда мы хотим‚ чтобы некоторые переменные были константными и неизменяемыми.Кроме того‚ мы можем использовать `typing.final` для указания‚ что функция не может быть переопределена в подклассах. Это может быть полезно‚ если мы хотим зафиксировать поведение функции и не позволить наследникам изменять его.Предположим‚ у нас есть базовый класс `Shape` с методом `area`‚ который вычисляет площадь фигуры⁚
python
from typing import final
class Shape⁚
@final
def area(self) -> float⁚
pass
Теперь‚ если мы создадим подкласс `Square` и попытаемся переопределить метод `area`‚ мы получим ошибку⁚
python
class Square(Shape)⁚
def area(self) -> float⁚ # Ошибка⁚ ‘area’ is final and cannot be overridden
pass
Опция `typing.final` позволяет нам зафиксировать поведение некоторых компонентов нашего кода‚ делая его более надежным и легко поддерживаемым.