[БЕЗ ЗВУКА] [БЕЗ ЗВУКА] В прошлом видео мы разобрались с такими понятиями как класс, объект и объект класса. Давайте теперь познакомимся с другими двумя понятиями, которые также нередко путают между собой. Это понятия интерфейса и реализации. Если вы знакомы с такими языками программирования как Java или C#, вы скорее всего слышали об интерфейсах как об аналогах абстрактных базовых классов. Таких интерфейсов в Python не существует, так что разговор пойдет не о них. Под интерфейсом мы будем понимать совокупность всех способов доступа и взаимодейтсвия с некоторым объектом. В литературе для данного понятия можно также найти термин "абстракция". Из чего же складывается интерфейс объекта? Вы уже знаете про парадигму наследования. Так вот, интерфейс объекта состоит из публичных методов и переменных, доставшихся классу от его родительских классов, а также из его собственных публичных полей. Интерфейс это то, что будет видеть пользователь вашего объекта. Именно он будет описан в пользовательской документации к вашему продукту. Когда вы пишете свой класс, следует подробно и тщательно продумывать его интерфейс, чтобы пользователь имел простой и понятный доступ ко всей функциональности, которую вы хотите дать вашему объекту, и чтобы он, наоборот, не получил доступ к каким-то его внутренностям, которые вы хотите скрыть или которые позволяют сломать ваш объект. При проектировании интерфейса всегда следует думать о пользователе. Не забывайте две важные концепции: красивое лучше, чем уродливое, и простое лучше, чем сложное. Так говорится в "Цзене Python". Итак, интерфейс это лицо, оболочка вашего класса. Но что же тогда является его внутренностями? Внутренности это и есть реализация. Реализация может быть очень и очень сложной. Но пользователь ее попросту не видит. Она описывает то, как именно устроен ваш объект. Каким образом он будет решать поставленную перед ним задачу. Разберем интерфейс реализацию на примере такого просто объекта как питоновский список- лист. Вы пользуетесь списками довольно часто, вы знаете много их методов. Вы знаете методы append, extend, insert, которые позволяют расширять список. Вы знаете методы pop, remove, clear- удаляющие элементы. Вы пользуетесь срезами списков, вы можете их складывать, сортировать, сравнивать и многое, многое другое. Это очень удобная в использовании структура данных. Но что же с ее реализацией? Что делает списки такими удобными и простыми? А реализация списка это более 3000 строк кода на языке C. Там описано сколько памяти и какого типа следует выделять при создании списка, каким образом хранятся в нем элементы, как получить к ним доступ и много, многое другое. Вы пользуетесь методом append, но знаете ли вы, что происходит при его вызове? Ведь памяти под список обычно выделяется больше места, чем занимают все его элементы. Но мы можем класть в список сколько угодно элементов, поэтому рано или поздно любое место закончится, и в этот момент нужно будет выделить новую память. Но сколько памяти выделить? Чем больше список, тем больший кусок памяти выделяется. При вставке элемента в середину списка кроме возможного выделения памяти будут также сдвинуты и все остальные элементы. Поэтому такая операция сложнее, чем операция вставки в конец. Что же происходит при выталкивании элемента? На самом деле возвращается объект, лежащий в последней ячейке списка, а длина списка просто уменьшается на единицу. При этом реального удаления объекта из списка не происходит до тех пор, пока его длина не станет меньше половины размера выделенной памяти. И только тогда данные будут очищены, а память освобождена для повторного использования. Подведем итоги. Интерфейс класса и реализация это разные вещи. Интерфейс это лицо класса, именно через взаимодействие с интерфейсом осуществляется работа с объектом класса. Интерфейс это совокупность всех публичных методов и переменных. Реализация же это внутреннее устройство класса. Она не видна пользователю, но именно благодаря реализации объект выполняет свои задачи. Реализация бывает очень и очень сложной. Иногда разбираться в ней весьма проблематично. Однако знание реализации позволяет лучше понимать работу объекта и активнее его использовать. К реализации относится совокупность всех публичных и приватных методов и переменных, содержащихся в классе и доставшихся ему в наследство от родительских классов. В следующем блоке курса вас ждет знакомство с принципа и парадигмами ООП. [БЕЗ ЗВУКА] [БЕЗ ЗВУКА]