Sobes.tech
Senior
289

Что такое принцип подстановки Барбары Лисков (LSP) и как он применяется в разработке на Python?

AI-дан жауап

sobes.tech AI

Принцип LSP (Liskov Substitution Principle) гласит, что объекты базового (родительского) класса должны быть заменяемы объектами подкласса без нарушения корректности работы программы. Это означает, что если класс B является подклассом класса A, где бы ожидался объект класса A, можно безопасно использовать объект класса B.

Применение в Python:

  1. Наследование без изменения поведения: Подклассы должны расширять функциональность, а не изменять или нарушать существующее поведение базового класса.

    # Хорошо: Square is a Rectangle where width == height
    class Rectangle:
        def __init__(self, width, height):
            self.width = width
            self.height = height
    
        def area(self):
            return self.width * self.height
    
        def set_width(self, width):
            self.width = width
    
        def set_height(self, height):
            self.height = height
    
    class Square(Rectangle):
        def __init__(self, side):
            super().__init__(side, side)
    
        def set_width(self, width):
            super().set_width(width)
            super().set_height(width)
    
        def set_height(self, height):
            super().set_width(height)
            super().set_height(height)
    
    # Плохо: Если set_width и set_height в Square не были бы адаптированы для Square,
    # то поведение area() могло бы стать нелогичным при использовании Square
    # там, где ожидался Rectangle.
    
  2. Одинаковые сигнатуры методов: Методы в подклассах должны сохранять совместимость сигнатур с методами в базовом классе (количество и типы аргументов, возвращаемое значение).

  3. Неожиданные исключения: Подклассы не должны выбрасывать исключения, которые базовый класс не объявил (если это возможно в Python, что менее формализовано, чем в языках с строгой типизацией исключений, но принцип остается).

  4. Сохранение инвариантов: Подклассы должны поддерживать инварианты (условия, которые всегда должны оставаться истинными) базового класса.

Нарушение LSP часто приводит к неожиданному поведению программы и усложняет ее поддержку.