Какие механизмы в Python контролируют наследование и изменение классов?

Ответ

В Python существуют механизмы, которые помогают контролировать наследование и изменение классов, обеспечивая предсказуемость и надежность кода:

  1. @final (PEP 591) — декоратор, запрещающий наследование от класса или переопределение метода, что гарантирует стабильность базовой реализации.

    from typing import final
    
    @final
    class Base:
        def method(self):
            pass
    
    class Child(Base):  # Ошибка: Cannot inherit from final class "Base"
        # def method(self): # Ошибка: Cannot override final method "method"
        pass
  2. @dataclass(frozen=True) (из модуля dataclasses) — делает атрибуты класса неизменяемыми после инициализации, предотвращая случайные модификации и обеспечивая иммутабельность объектов.

    from dataclasses import dataclass
    
    @dataclass(frozen=True)
    class Point:
        x: int
        y: int
    
    p = Point(1, 2)
    # p.x = 3  # Ошибка: cannot assign to field 'x' (при попытке изменить атрибут)
  3. @sealed (PEP 622) — декоратор, ограничивающий набор возможных подклассов (пока не реализован в стандартной библиотеке). Его цель — позволить строго контролировать иерархию типов, предотвращая создание непредусмотренных подклассов.

Эти механизмы помогают создавать более надежный и предсказуемый код, предотвращая нежелательные изменения в иерархии классов и состоянии объектов.