HTML Diff
1 added 1 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>На прошлом уроке мы подошли к основной идее ООП: повышение уровня абстракции за счет объединения процедур и данных в "объект". Эта идея остается неизменной, какой бы конкретный язык, реализующий объектный подход, мы бы ни выбрали. Однако, способы достичь объектности у разных языков разные. Мы будем рассматривать ООП применительно к Python, но имейте в виду, что в других языках отдельные моменты программирования в объектном стиле будут отличаться, порой - сильно.</p>
1 <p>На прошлом уроке мы подошли к основной идее ООП: повышение уровня абстракции за счет объединения процедур и данных в "объект". Эта идея остается неизменной, какой бы конкретный язык, реализующий объектный подход, мы бы ни выбрали. Однако, способы достичь объектности у разных языков разные. Мы будем рассматривать ООП применительно к Python, но имейте в виду, что в других языках отдельные моменты программирования в объектном стиле будут отличаться, порой - сильно.</p>
2 <h2>Объекты и классы</h2>
2 <h2>Объекты и классы</h2>
3 - <p>В Python объекты - это значения, создаваемые на основе шаблона -<em>класса</em>. Программист описывает с помощью специального синтаксиса содержимое класса и потом во время исполения создает объекты -<em>экземпляры (instances) этого класса</em>. У класса есть свои данные - атрибуты класса. К ним имеют доступ все экземпляры класса. При этом экземпляры имеют свои атрибуты - атрибуты экземпляра. Эти данные доступны только объекту.</p>
3 + <p>В Python объекты - это значения, создаваемые на основе шаблона -<em>класса</em>. Программист описывает с помощью специального синтаксиса содержимое класса и потом во время исполнения создает объекты -<em>экземпляры (instances) этого класса</em>. У класса есть свои данные - атрибуты класса. К ним имеют доступ все экземпляры класса. При этом экземпляры имеют свои атрибуты - атрибуты экземпляра. Эти данные доступны только объекту.</p>
4 <blockquote><p>Технически в Python любой объект может получить доступ к содержимому любого другого объекта, если имеет ссылку на него. Но на уровне добровольных соглашений такой доступ можно ограничивать.</p>
4 <blockquote><p>Технически в Python любой объект может получить доступ к содержимому любого другого объекта, если имеет ссылку на него. Но на уровне добровольных соглашений такой доступ можно ограничивать.</p>
5 </blockquote><p>Некоторые атрибуты могут быть функциями. В этом случае такие атрибуты называют<em>методами</em>. Вы уже пользовались методами списков и словарей, так что некоторое представление о методах у вас имеется.</p>
5 </blockquote><p>Некоторые атрибуты могут быть функциями. В этом случае такие атрибуты называют<em>методами</em>. Вы уже пользовались методами списков и словарей, так что некоторое представление о методах у вас имеется.</p>
6 <h2>Инкапсуляция</h2>
6 <h2>Инкапсуляция</h2>
7 <p><em>Инкапсуляция</em>- это упаковывание данных и поведения (процедур, работающих с данными) в один объект. Инкапсуляция преследует все ту же цель - сокрытие сложности за абстракцией. Но просто так складывать все подряд в какой-то объект не следует. Данных и поведения должно быть столько, сколько<em>необходимо</em>и<em>достаточно</em>: объект должен хранить все свои и только свои данные самостоятельно и предоставлять все необходимые средства для манипуляции этими данными.</p>
7 <p><em>Инкапсуляция</em>- это упаковывание данных и поведения (процедур, работающих с данными) в один объект. Инкапсуляция преследует все ту же цель - сокрытие сложности за абстракцией. Но просто так складывать все подряд в какой-то объект не следует. Данных и поведения должно быть столько, сколько<em>необходимо</em>и<em>достаточно</em>: объект должен хранить все свои и только свои данные самостоятельно и предоставлять все необходимые средства для манипуляции этими данными.</p>
8 <p>Представим для примера, что у нас смоделирован объект "человек". Человек может иметь домашних питомцев. Так вот с точки зрения инкапсуляции неверно будет хранить питомцев где-то в отдельном списке: питомцы принадлежат человеку, это часть данных модели человека в нашей системе. Делаем вывод: список питомцев должен быть инкапсулирован в объект "человек".</p>
8 <p>Представим для примера, что у нас смоделирован объект "человек". Человек может иметь домашних питомцев. Так вот с точки зрения инкапсуляции неверно будет хранить питомцев где-то в отдельном списке: питомцы принадлежат человеку, это часть данных модели человека в нашей системе. Делаем вывод: список питомцев должен быть инкапсулирован в объект "человек".</p>
9 <p>Теперь представим, что нам нужно прикреплять питомцев к уже существующему человеку. Если мы дадим прямой доступ к списку питомцев и разрешим делать с этим списком любые преобразования, возможные для обычных списков, то мы можем получить человека, питомцами которого являются два десятка чисел и строк, а также пароход, файл и None. По-хорошему, программист, работающий с нашей моделью человека, вообще не должен знать, что питомцы хранятся в списке, ему достаточно (и необходимо) метода "добавить питомца" - вот это и есть абстракция.</p>
9 <p>Теперь представим, что нам нужно прикреплять питомцев к уже существующему человеку. Если мы дадим прямой доступ к списку питомцев и разрешим делать с этим списком любые преобразования, возможные для обычных списков, то мы можем получить человека, питомцами которого являются два десятка чисел и строк, а также пароход, файл и None. По-хорошему, программист, работающий с нашей моделью человека, вообще не должен знать, что питомцы хранятся в списке, ему достаточно (и необходимо) метода "добавить питомца" - вот это и есть абстракция.</p>
10 <h2>Полиморфизм</h2>
10 <h2>Полиморфизм</h2>
11 <p><em>Полиморфизм</em>("многообразие форм" по-гречески) позволяет смотреть на разные объекты так, чтобы с определенной точки зрения они были похожи. Под похожестью здесь мы подразумеваем одинаковое поведение, то есть возможность выполнить одни и те же действия.</p>
11 <p><em>Полиморфизм</em>("многообразие форм" по-гречески) позволяет смотреть на разные объекты так, чтобы с определенной точки зрения они были похожи. Под похожестью здесь мы подразумеваем одинаковое поведение, то есть возможность выполнить одни и те же действия.</p>
12 <p>Например, для того, чтобы произвести перекличку, мне достаточно знать, что все опрашиваемые субъекты могут назвать себя. И в данном случае не важно, у кого мы спрашиваем имя - у человека, робота или говорящего динозавра.</p>
12 <p>Например, для того, чтобы произвести перекличку, мне достаточно знать, что все опрашиваемые субъекты могут назвать себя. И в данном случае не важно, у кого мы спрашиваем имя - у человека, робота или говорящего динозавра.</p>
13 <p>Так вот, код, который работает с разными объектами без точного знания того, с чем он работает в данный момент, и использующий только лишь их (объектов)<em>общие свойства</em>, называется<em>полиморфным</em>. А возможность писать такой код - и есть<em>полиморфизм</em>.</p>
13 <p>Так вот, код, который работает с разными объектами без точного знания того, с чем он работает в данный момент, и использующий только лишь их (объектов)<em>общие свойства</em>, называется<em>полиморфным</em>. А возможность писать такой код - и есть<em>полиморфизм</em>.</p>
14 <p>Как вы можете уже догадаться, полиморфизм тоже связан с абстракцией: полиморфному коду достаточно знать об объектах только важные ему сведения, от остального знания код<em>абстрагируется</em>.</p>
14 <p>Как вы можете уже догадаться, полиморфизм тоже связан с абстракцией: полиморфному коду достаточно знать об объектах только важные ему сведения, от остального знания код<em>абстрагируется</em>.</p>
15 <p>В приведенном выше примере про человека и питомцев мы можем ввести такую абстракцию: питомцем может считаться что угодно, чем человек может владеть и о чем может заботиться, получая от заботы удовольствие (очень абстрактное описание понятия "питомец", не правда ли?). Под эту абстракцию подойдет, например, камень, или игрушечный робот - его можно любить, о нем можно заботиться (мыть камень, менять батарейки у робота). Вот такая вот забавная абстрактная модель взаимоотношений человека с питомцем.</p>
15 <p>В приведенном выше примере про человека и питомцев мы можем ввести такую абстракцию: питомцем может считаться что угодно, чем человек может владеть и о чем может заботиться, получая от заботы удовольствие (очень абстрактное описание понятия "питомец", не правда ли?). Под эту абстракцию подойдет, например, камень, или игрушечный робот - его можно любить, о нем можно заботиться (мыть камень, менять батарейки у робота). Вот такая вот забавная абстрактная модель взаимоотношений человека с питомцем.</p>
16 <h2>Наследование</h2>
16 <h2>Наследование</h2>
17 <p><em>Наследование</em>- свойство объектной модели устанавливать связь между классами так, что<em>классы-потомки</em>получают<em>(наследуют)</em>те же свойства и поведение, которыми обладают<em>классы-предки</em>. Одни и те же классы могут быть потомками одних классов и при этом являться предками для других - так получаются "иерархии классов".</p>
17 <p><em>Наследование</em>- свойство объектной модели устанавливать связь между классами так, что<em>классы-потомки</em>получают<em>(наследуют)</em>те же свойства и поведение, которыми обладают<em>классы-предки</em>. Одни и те же классы могут быть потомками одних классов и при этом являться предками для других - так получаются "иерархии классов".</p>
18 <p>Иногда такие иерархии повторяют иерархии объектов реального мира, в других ситуациях сущности, описываемые классами могут описывать что-то, не имеющее аналогов за пределами модели. Но во всех случаях мы опять же получаем инструмент для абстрагирования: если мы знаем, что некий класс реализует нужное нам поведение, то мы можем предполагать, что и все его потомки, в том числе и непрямые, будут этим поведением обладать.</p>
18 <p>Иногда такие иерархии повторяют иерархии объектов реального мира, в других ситуациях сущности, описываемые классами могут описывать что-то, не имеющее аналогов за пределами модели. Но во всех случаях мы опять же получаем инструмент для абстрагирования: если мы знаем, что некий класс реализует нужное нам поведение, то мы можем предполагать, что и все его потомки, в том числе и непрямые, будут этим поведением обладать.</p>
19 <p>Все в том же примере системы с людьми и питомцами все питомцы (соответствующие классы) семейства кошачьих могут иметь общего предка (тоже класса) "Абстрактная Кошка". Про которую известно, что она умеет прыгать и пить молоко. Это знание позволит нам, всего лишь проверив принадлежность конкретного питомца к Абстрактным Кошкам, понять, чем мы можем питомца кормить и хватит ли невысокого забора вокруг жилища, чтобы питомец не убежал.</p>
19 <p>Все в том же примере системы с людьми и питомцами все питомцы (соответствующие классы) семейства кошачьих могут иметь общего предка (тоже класса) "Абстрактная Кошка". Про которую известно, что она умеет прыгать и пить молоко. Это знание позволит нам, всего лишь проверив принадлежность конкретного питомца к Абстрактным Кошкам, понять, чем мы можем питомца кормить и хватит ли невысокого забора вокруг жилища, чтобы питомец не убежал.</p>
20 <p>Тут вы можете даже увидеть связь наследования с полиморфизмом: если мы знаем, что питомец - кошка, то большего нам знать и не нужно. Получается полиморфный код, работающий только с кошками, но зато с любыми.</p>
20 <p>Тут вы можете даже увидеть связь наследования с полиморфизмом: если мы знаем, что питомец - кошка, то большего нам знать и не нужно. Получается полиморфный код, работающий только с кошками, но зато с любыми.</p>
21 <h2>ООП и реальный мир</h2>
21 <h2>ООП и реальный мир</h2>
22 <p>Во многих источниках информации об ООП говорят о том, что объектный подход интуитивен, ведь он позволяет описывать реальный мир. После знакомства с подходом при подобном его позиционировании разработчик часто начинает строить иерархии классов, подобные существующим в реальности: "млекопитающие - кошачьи - тигры". Вот только у ООП<em>нет такой цели - моделировать жизнь</em>.</p>
22 <p>Во многих источниках информации об ООП говорят о том, что объектный подход интуитивен, ведь он позволяет описывать реальный мир. После знакомства с подходом при подобном его позиционировании разработчик часто начинает строить иерархии классов, подобные существующим в реальности: "млекопитающие - кошачьи - тигры". Вот только у ООП<em>нет такой цели - моделировать жизнь</em>.</p>
23 <p>Программы пишутся для компьютеров. И пишутся в основном не биологами или астрономами, а "компьютерщиками". Поэтому гораздо больше шансов встретить объект-дерево, моделирующий не "березу", а "красно-черное" (и это не слегка подгоревший осенью клен.). Программисту нужно управлять сложностью кода, а не каталогизировать флору и фауну, вот он и абстрагирует сущности, выделяя их из кода, из алгоритмов.</p>
23 <p>Программы пишутся для компьютеров. И пишутся в основном не биологами или астрономами, а "компьютерщиками". Поэтому гораздо больше шансов встретить объект-дерево, моделирующий не "березу", а "красно-черное" (и это не слегка подгоревший осенью клен.). Программисту нужно управлять сложностью кода, а не каталогизировать флору и фауну, вот он и абстрагирует сущности, выделяя их из кода, из алгоритмов.</p>
24 <p>ООП - это всего лишь развитие существовавших и до появления самого термина "Объектно Ориентированное Программирование" инструментов. Объекты в голове программиста существовали уже тогда, когда он использовал только структуры данных и процедуры для работы с ними. Выделение подхода ООП всего лишь систематизировало уже привычные техники, внесло общую терминологию и общие техники для решения типичных задач (те самые "паттерны проектирования").</p>
24 <p>ООП - это всего лишь развитие существовавших и до появления самого термина "Объектно Ориентированное Программирование" инструментов. Объекты в голове программиста существовали уже тогда, когда он использовал только структуры данных и процедуры для работы с ними. Выделение подхода ООП всего лишь систематизировало уже привычные техники, внесло общую терминологию и общие техники для решения типичных задач (те самые "паттерны проектирования").</p>
25 <p>Предметная область - игра, игроки, персонажи, битвы - тоже поддается моделированию с помощью объектов. Но моделирование это должно делаться не для красоты самой модели, не для составления каталога игровых сущностей, а для упрощения написания кода, решающего конкретную задачу (написания игры).</p>
25 <p>Предметная область - игра, игроки, персонажи, битвы - тоже поддается моделированию с помощью объектов. Но моделирование это должно делаться не для красоты самой модели, не для составления каталога игровых сущностей, а для упрощения написания кода, решающего конкретную задачу (написания игры).</p>