Python 3.8+typingпонятие
typing.final
декораторы и маркеры
Декоратор @final: класс нельзя наследовать, метод нельзя переопределять. Запрет проверяет только тайп-чекер, а не интерпретатор.
Синтаксис
@final
class Leaf: ...
Не путайте с Final: typing.Final — аннотация переменной (MAX: Final = 10, «не переприсваивать»), а @final — декоратор класса или метода. В рантайме наследование от @final-класса проходит молча, ошибку покажут только mypy или pyright. С 3.11 декоратор ставит __final__ = True, но это обычный атрибут класса, и наследник получает его тоже, так что getattr(Sub, '__final__') у подкласса тоже True — для проверки берите vars(cls).
Примеры
# Python 3.11+
from typing import final
@final
class Leaf:
pass
class Other(Leaf): # mypy: Cannot inherit from final class
pass
print(Leaf.__final__, getattr(Other, '__final__', False)) # → True True — атрибут унаследован
print('__final__' in vars(Other)) # → False
from typing import final
class Base:
@final
def done(self) -> str:
return 'base'
class Sub(Base):
def done(self) -> str: # mypy: Cannot override final attribute
return 'sub'
print(Sub().done()) # → sub — интерпретатор не мешает
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности