Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708

Принцип подстановки Барбары Лисков

19.06.2021, 12:22. Показов 4104. Ответов 25

Студворк — интернет-сервис помощи студентам
Не понятен пример применения принципа ООП на python:

Главная идея, стоящая за Liskov Substitution Principle в том, что для любого класса клиент должен иметь возможность использовать любой подкласс базового класса, не замечая разницы между ними, и следовательно, без каких-либо изменений поведения программы при выполнении. Это означает, что клиент полностью изолирован и не подозревает об изменениях в иерархии классов.
Более формально: Пусть q(x) является свойством, верным относительно объектов x некоторого типа T. Тогда q(y) также должно быть верным для объектов y типа S, где S является подтипом типа T.
Проще говоря, это значит, что подкласс, дочерний класс должны соответствовать их родительскому классу или супер классу.
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class User():
  def __init__(self, color, board):
    create_pieces()
    self.color = color
    self.board = board
  def move(self, piece:Piece, position:int):
      piece.move(position)
      chessmate_check()
  board = ChessBoard()
  user_white = User("white", board)
  user_black = User("black", board)
  pieces = user_white.pieces
  horse = helper.getHorse(user_white, 1)
  user.move(horse)
LSP это основа хорошего объектно-ориентированного проектирования программного обеспечения, потому что он следует одному из базовых принципов ООП — полиморфизму. Речь о том, чтобы создавать правильные иерархии, такие, что классы, производные от базового являлись полиморфными для их родителя по отношению к методам их интерфейсов. Ещё интересно отметить, как этот принцип относится к примеру предыдущего принципа. Если мы пытаемся расширить класс новым несовместимым классом, то все сломается. Взаимодействие с клиентом будет нарушено, и как результат, такое расширение будет невозможно (или, для того чтобы сделать это возможным, нам пришлось бы нарушить другой принцип и модифицировать код клиента, который должен быть закрыт для модификации, такое крайне нежелательно и неприемлемо).
Тщательное обдумывание новых классов в соответствии с LSP помогает нам расширять иерархию классов правильно. Также, LSP способствует OCP.

Рассказали бы своими словами, в чем фича данного примера?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.06.2021, 12:22
Ответы с готовыми решениями:

Принцип подстановки
Всем привет. В чём заключается принцип подстановки при работе с классами, а конкретнее, при работе с виртуальными методами. Как оформляется...

принцип подстановки
надо описать 3 объекта используя принци подстановки, код я написал, но компилятор ругается, помогите найти ошибку. #include...

Лисков и open/close - одно и то же?
Я вот думаю, если мы соблюдаем open/close, у нас автоматически получится лисков. Можете привести пример, когда это будет не так? ...

25
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
19.06.2021, 13:10
Как-то так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from abc import ABC, abstractmethod
from functools import singledispatch
 
 
class Feline(ABC):
    @abstractmethod
    def meow(self):
        raise NotImplementedError
        
class Cat(Feline):
    def meow(self):
        print("Meow!")
        
class Tiger(Feline):
    def meow(self):
        print("Roar!")
        
@singledispatch
def makeSound(feline):
    raise NotImplementedError
    
@makeSound.register
def _(feline: Feline):
    feline.meow()
    
felines = Cat(), Tiger()
for feline in felines:
    makeSound(feline)
2
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
19.06.2021, 13:39  [ТС]
Arsegg, ни чуть не прояснили картину) еще несколько штрихов и другой шедевральный код...

Добавлено через 2 минуты
Arsegg, при выполнении каких конкретно выражений можно понять соблюдается данный принцип или нет?

Добавлено через 7 минут
Цитата Сообщение от Arsegg Посмотреть сообщение
@makeSound.register
что такое метод register? И как Вы задекорировали функцию _, функцией декоратором которая ничего не возвращает на данном примере, что все таки возвращает декоратор singledispatch,
и что конкретно означает запись в качестве аргумента функции (feline: Feline). Данная запись используется для указания типа аргумента, а в данном случае?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,675
Записей в блоге: 29
19.06.2021, 13:51
AlexMarkov, для меня принцип Варвары Лисковой означет лишь что наследник должен иметь те же методы что и родитель и эти методы должны быть совместимы с родительским. Условно говоря, если метод Мяу родителя просто в консоль писал слово, то у наследника он не должен возвращать инт и ничего не писать в консоль. Потому что юзер, использующий этот метод, но вызвавший его на наследнике ожидал выполнения определенного контракта, а ему вдруг совсем новое поведение.
2
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
19.06.2021, 14:05  [ТС]
Welemir1, проще "ето" хорошо как и все гениальное, ну вот "извилинки че то не шевелятся", надо бы как при прокачке мышцы, ну сами понимаете, на преодолении собственных возможностей все прокачивается и на примерах из реала
Цитата Сообщение от AlexMarkov Посмотреть сообщение
клиент полностью изолирован и не подозревает об изменениях в иерархии классов
Изолировать инкапсуляцией можно, ну вот подозрения клиента об изменениях, выше моих возможностей))
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
19.06.2021, 14:07
AlexMarkov, если кратко, как я его понимаю, то подклассы должны быть ковариантны с его суперклассом. Т. е. в переопределяемых методах наследника:
1) Не должен расширяться/меняться выходной тип метода: метод (родителя) возвращает int, а ты возвращаешь float в наследнике;
2) Не должен расширяться тип бросаемых исключений/появляться новые: метод (родителя) ничего не бросает, а ты в наследнике кидаешь ValueError;
3) Не должно меняться поведение метода: например, наследник класса Feline не должен квакать (Feline.meow).
P. S. На Java это проще понять, имхо.
2
19.06.2021, 14:38

Не по теме:

Arsegg, да в джаве на уровне языка все это если верно помню и по исклочениям и по возвращаеммому типу...

0
19.06.2021, 16:08

Не по теме:

Welemir1, а как на проде (проекта на Python) разруливают программирование по контракту (интерфейсы) без functools.singledispatch и пр.?

0
19.06.2021, 16:16

Не по теме:

Arsegg, здравым смыслом и аннотациями +докой. Кроме того наследование не так широко уж и используется, прям каких то больших иерархий я не видел (как в джаве), а вот диспатч вообще редко вижу, больше в статьях про то, зачем он нужен. В жизни никогда не видел его применения.

0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
19.06.2021, 18:13
Цитата Сообщение от AlexMarkov Посмотреть сообщение
Главная идея, стоящая за Liskov Substitution Principle в том, что для любого класса клиент должен иметь возможность использовать любой подкласс базового класса
Я не знаком с Liskov Substitution Principle, но
не могу согласится с тем, что
Цитата Сообщение от AlexMarkov Посмотреть сообщение
для любого класса клиент должен иметь возможность использовать любой подкласс базового класса, не замечая разницы между ними
То есть Вы хотите сказать, что класс "Корова", как подкласс суперкласса "Млекопитающее", должен иметь возможность использовать подкласс "Человек" , который тоже является подклассом суперкласса "Млекопитающее"?
Возьмем еще, более контрастный пример.Рассмотрим суперкласс "Живое существо".
Судя Вашей логике, подкласс "Комар" должен иметь возможность использовать подкласс "Человек"? И тот и другой являются подклассами суперкласса "живое существо". И общее между ними, может быть только то, что является общим для всех живых существ.
Но глубже копать не могу, так как мне не совсем понятно, что значит "должен иметь возможность использовать подкласс".
Однако комментарии к теме освежили в моей памяти некоторые соображения, которые я высказывал где то на каком то форуме.
Кликните здесь для просмотра всего текста
Дело в том, что классы и подклассы в питоне, не соответствуют строго классическим понятиям классов в науке.
В классическом понятии подкласс родительского класса не может заменять значения атрибутов родительского класса, а только добавлять новые атрибуты, и добавлять значения атрибутов, если наличие атрибута в родительском классе есть, но его значение не определено (None). В питоне же мы в подклассе можем изменять значение атрибута, которое задано в родительском классе. И это отличие нужно учитывать.
Что еще важно. Не возможно точно смоделировать все многообразие деревьев классов для любого реального объекта мышления человека. Возьмем для примера такой объект, как "яблоко". Начнем перечислять классы, которым принадлежит объект "яблоко". Фрукт, продукт, плод растения, шар, сырье для фруктового салата, сырье для сока, и еще много классов, для чего яблоко является сырьем, сорт яблока, яблоко зрелое, яблоко падалица, яблоко дикое. Если подумать, можно еще много придумать разновидностей (подклассов) яблок.
Поэтому я пришел к выводу, что полностью смоделировать мышление человека не возможно, никаких вычислительных мощностей не хватит. Не говоря уже о нечеткой логике и вероятностях при мышлении. Мозг конечно, это сверх совершенное произведение созданное природой. Поэтому я не боюсь реального "Восстания машин". Человек никогда не создаст ничего совершеннее, чем создала природа. Мозг так и не изучен до конца. Не исключаю, что в нем происходят процессы на уровне атомов и межатомных полей. Человек описал, но до сих пор не может осознать двуликость ядерных частиц, когда электрон одновременно описывается и как частица и как волновая сущность.
И все таки приближенно (примитивно) можно с помощью ООП моделировать человеческое мышление. И именно отталкиваясь (идя) от реального мышления можно с помощью ООП в питоне моделировать (упрощенно) это мышление.
Поэтому при решении задач, оперирующих реальными объектами, необходимо решать задачу используя свой интеллект и логику, и опираясь на свое мышление при решении задачи, описывать мыслительный алгоритм ее решения, Заттем основываясь на использованных объектах своего мышления применить ООП, что бы описать этот процесс мышления (хоть и упрощенно) для построения цифровой модели. Именно такую цифровую модель мышления человека я и называю искусственным интеллектом ИИ.
Именно по этой причине, не смотря на всю пользу, я не считаю нейронные сети относящимися к ИИ. То просто мощная технология, для обработки больших массивов данных. Технология востребованная и очень нужная, но не являющаяся ИИ, так как не моделирует процесс человеческого мышления, в котором есть отражение объектов реального мира, при этом с нечеткими связями (ассоциациями) и с формируемыми мозгом объектами, такими, как например классы, которых в реальном мире нет, а формируются только в мозгу человека.
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
19.06.2021, 19:13  [ТС]
УВ.Viktorrus, я не любитель присваивать себе чужие записи, ну думаю вопрос был бы не понятен,
если не был бы приведен весь текст рассматриваемой статьи( репозитория) на github, скорее всего это
не качественный перевод, я не вникал в суть приведенного текста, мне интересен был пример. Так как на
Хабре в статье о принципах solid ничего кроме примеров на Javascript не нашел.
То что нейронные сети не являются ИИ "ежу понятно", если он, этот "еж" хоть одну книжку по информатике и математике прочитал.))

Добавлено через 8 минут
Ну тему не считаю закрытой, так как никто так и не ответил на вопрос: " В чем фича данного примера?". Интерпретация данного кода, а лучше кода который предоставил ув. Arsegg.

Добавлено через 8 минут
на Java и PHP))

Добавлено через 11 минут
Можно вечно идти торетическим методом познания действительности, не приложив и долю к решению задач из реального мира, ради чего, собственно, вся эта "вакханалия" и затевалась. Именно поэтому на данном этапе развития информационных систем правильнее все таки
называть программный продукт "Приложением". Приложением к реальной жизни, помогающим или упращающим какую-либо монотонную повторяющуюся задачу. Я не знаю, может крупные корпорации уже на другом этапе развития, ну мне от этого "тук тук кто-там" как почтальону Печкину до велосипеда.
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
19.06.2021, 19:18
Цитата Сообщение от AlexMarkov Посмотреть сообщение
В чем фича данного примера?
То, что ты работаешь с интерфейсом Piece, а не с к каждой его конкретной реализацией: Pawn, Knight, Bishop и т. д.
Если ты напишешь свою реализацию интерфейса Piece с блекджеком и куртизанками, то это будет, как минимум странно. Об этом как раз и гласит принцип.
Например, Piece.move(position) будет вызывать куртизанок на данную позициюкидать исключение на некорректную позицию, возвращать иное, чем None значение и т. п.
P. S.
Кликните здесь для просмотра всего текста
Голубь осудил Варвару Лисков и нарушил контракт класса Bird:
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
19.06.2021, 19:23  [ТС]
Общество предано забвению коммерческим интересам не имеющим ни малейшего отношения к достижению конечной цели: в поисках истины не забывать, что истинным признают, только то что будет принято всем обществом, до последнего индивидуума.

Добавлено через 3 минуты
Arsegg, т.е. я был прав это просто аннотация?
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
19.06.2021, 19:27
Цитата Сообщение от AlexMarkov Посмотреть сообщение
т.е. я был прав это просто аннотация?
Данная формулировка (вопроса) некорректна сама по себе.
Можно утверждать, что анноташки - сайд эффект, но не более того, т. к. LSP не про это...
1
99 / 86 / 20
Регистрация: 10.09.2019
Сообщений: 708
19.06.2021, 19:37  [ТС]
про блэкджек с куртизанками, что-ли?
0
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
19.06.2021, 19:59
Arsegg, То есть это что то типа реализации аналогий? Когда объекты из разных областей ведут себя аналогично, если сравнивать их поведение абстрактно?
То есть создается какой то универсальный интерфейс, который описывает аналогичное поведение объектов различных классов. Вроде это и называется полиморфизмом. Когда используется одна логика поведения для разных сущностей.
Или я не правильно понял?
Скажу честно, подробно разбираться с технологией Liskov Substitution Principle мне не хочется, так как не вижу в ней необходимость для меня.
Если я правильно понял сущность, то такая технология важна для тех, кто клепает программы серийно, и находя аналогию с другой задачей, использует уже написанный код, той другой задачи, если он написан с использованием технологии Liskov Substitution Principle.
1
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
19.06.2021, 20:32
Цитата Сообщение от Viktorrus Посмотреть сообщение
То есть Вы хотите сказать, что класс "Корова", как подкласс суперкласса "Млекопитающее", должен иметь возможность использовать подкласс "Человек" , который тоже является подклассом суперкласса "Млекопитающее"?
Нет. Подкласс здесь - имеется в виду наследник.
Допустим, имеется класс "живое существо", и у него есть метод "дышать". И он на выходе даёт CO2. Ну, так сложилось исторически. Так вот, этот принцип гласит, что все подклассы строго должны выдыхать углекислый газ, а если вдруг ваше существо выдохнет NO2 - это косяк.
Цитата Сообщение от Viktorrus Посмотреть сообщение
Скажу честно, подробно разбираться с технологией Liskov Substitution Principle мне не хочется, так как не вижу в ней необходимость для меня.
Это не технология, это принцип. Как не написать говнокод, проще говоря.
4
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
19.06.2021, 20:56
Цитата Сообщение от Viktorrus Посмотреть сообщение
То есть это что то типа реализации аналогий? Когда объекты из разных областей ведут себя аналогично, если сравнивать их поведение абстрактно?
То есть создается какой то универсальный интерфейс, который описывает аналогичное поведение объектов различных классов.
Не совсем. LSP про взаимозаменяемость классов наследников одного родительского класса.
Цитата Сообщение от Viktorrus Посмотреть сообщение
Вроде это и называется полиморфизмом. Когда используется одна логика поведения для разных сущностей.
Или я не правильно понял?
Полиморфизм не обязывает реализовывать аналогичное поведение для классов наследников. Тогда как LSP обязывает.
Цитата Сообщение от Viktorrus Посмотреть сообщение
Если я правильно понял сущность, то такая технология важна для тех, кто клепает программы серийно, и находя аналогию с другой задачей, использует уже написанный код, той другой задачи, если он написан с использованием технологии Liskov Substitution Principle.
Не обязательно.
Если ты полагаешься на имплементацию интерфейса (абстрактного класса, в т. ч. наследника abc.ABC), значит ты делаешь что-то не так.
P. S. Проблема тут в том, что в Python'е с его утиной типизацией недостаточно средств для показательного выражения данного принципа в коде.
P. P. S. Еще один пример LSP тут.
1
1732 / 970 / 199
Регистрация: 22.02.2018
Сообщений: 2,693
Записей в блоге: 6
20.06.2021, 04:26
Цитата Сообщение от dondublon Посмотреть сообщение
Нет. Подкласс здесь - имеется в виду наследник.
Но наследники могут находится в разных ветках от базового класса. Именно о таких наследниках я говорил, когда сравнивал наследников корову и человека, которые являются подклассами одного родительского класса млекопитающих. Если же рассматривать подклассы из одной ветки, то это уже совсем другое дело, тут у меня возражений нет. Тогда я просто не так понял, о чем идет речь. Прошу прощения.
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
20.06.2021, 09:39
Цитата Сообщение от Viktorrus Посмотреть сообщение
Но наследники могут находится в разных ветках от базового класса.
Любой наследник.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.06.2021, 09:39
Помогаю со студенческими работами здесь

Cобытийность. Принцип использования и принцип работы событий в jQ и GCT
Добрый день. Подготавливаюсь к собеседованию по чеклисту и не могу найти ответ на вопрос: событийность. Принцип использования и принцип...

Подстановки
Подстановки

подстановки
Вводится число n - порядок подстановки, и таблица 2*n в угловых скобках. Определите, является ли эта таблица подстановкой. 5 / 1 2 3...

Подстановки
Привет всем. У меня возник один вопрос. Я читаю учебник Куроша по высшей математике. И там в параграфе о подстановках приводится один...

Отображение подстановки
Всем доброго времени суток. Столкнулся с проблемой: в БД Access есть 2 таблицы 1 и 2. Делаю подстановку и связь один ко многим а в делфи ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru