ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 25.10.2023
Просмотров: 119
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
Помним, что в Python всё является объектами?
Вспомним про функции и для чего они нужны
Функции – это по сути программки внутри программы.
При первом рассмотрении можно сделать так:
И вы всегда знаете где эту книгу искать.
Используйте __new__, когда вам нужно контролировать создание нового экземпляра.
Используйте __init__, когда вам нужно контролировать инициализацию нового экземпляра.
Специальные методы… Да их еще много)
Три белых коня… кхм.. Три главных принципа ООП
Слово сильное и, возможно страшное.
(от греч. polymorphes многообразный)
ООП и зачем оно нам?
Просто об объектах
Помним, что в Python всё является объектами?
Примеры объектов в языке:
- Экземпляры пользовательских и встроенных типов;
- Сами типы;
- Байткод;
- Модули;
- Функции;
- Объекты являются объектами
- И Классы тоже являются объектами.
и т.д.
| Наименование (ссылка) | Объект |
| X | 1 |
| T | “Текст” |
| foo | def foo(): return True |
Вспомним про функции и для чего они нужны
Нужны для того чтоб сделать код:- Проще;
- Короче;
- Более отказоустойчивым;
- легко поддерживаемым;
- Легко тестируемым;
И вообще порядок в функциях — порядок в голове
Функции
Функции – это по сути программки внутри программы.
Они объединяют в себе инструкции относящиеся к одному какому-то процессу (это в идеале, конечно) и в каждую функцию нам может потребоваться передавать информацию о том с чем именно ей нужно работать. ЦиклГерой_ударить () Герой_подлечиться ()Враг1_выстрелить ()…Враг99_выстрелить ()Враг1_подлечиться ()…Враг99_подлечиться ()КонецЦиклаРассмотрим на примере игры. (Внимание! Пример очень упрощен)Если бы мы пользовались только функциямиПрограмма выглядела примерно так:ЦиклГерой_ударить () Герой_подлечиться ()Враг1_ударить ()Враг2_выстрелить ()Еще 97 таких же функций…Враг99_выстрелить ()Враг1_подлечиться ()Враг2_подлечиться ()Еще 97 таких же функций…Враг99_подлечиться ()КонецЦиклаПри внимательном рассмотрении можно заметить одинаковые функции для разных персонажей.ЦиклГерой_ударить () Герой_подлечиться ()Враг1_ударить ()Враг2_выстрелить ()Еще 97 таких же функций…Враг99_выстрелить ()Враг1_подлечиться ()Враг2_подлечиться ()Еще 97 таких же функций…Враг99_подлечиться ()КонецЦикла…………ГеройВраг1Враг2Враг99На деле можно делать и так:
НО:
- А если увеличить количество функций
- Если у вас «объекты» не однотипны? Например, есть враги, которые не лечатся, а имеют броню?
- А если объект обладает и лечением и броней? - Создать третий список
- А если и герой и враги могут использовать разное оружие?
- А если..
в 100 раз?
Создать дополнительный список объектов
Ну.. Плодить функции Атаки и делать проверку на то, какое у кого оружие.
А не кажется ли.. Что мы загоняем себя в угол?
Объекты
Можно подойти к архитектуре приложения с другой стороны и рассматривать сущности, которые есть в вашей программе, как отдельные объекты, каждый из которых может обращаться к общим функциям (методам), иметь свои свойства и события.При первом рассмотрении можно сделать так:
- Создаем два класса
- В каждом классе есть функция
_ _ init _ _ - Которая отвечает за инициализацию (Создание) Экземпляра класса (То есть объекта)
Она вызывается автоматически, когда мы делаем подобное:
X = NPC() или Y = Hero()
(так мы создаем объекты)
3) Параметр self – очень важен, он и создает всю эту магию.
Если по простому, то self это ссылка на наш конкретный объект
А при втором рассмотрении…
Можно подумать еще
Разберем пример с транспортом
Общий класс «Транспорт»Наследники класса «Транспорт»Наследники класса «Машины», который в свою очередь наследуется от класса «Транспорт» Общий класс «Транспорт»Наследники класса «Транспорт»Наследники класса «Машины», который в свою очередь наследуется от класса «Транспорт» Обратите внимание, все свойства и функции (Методы) наследуются от родителя.Кроме тех, которые мы переопределили в дочернем классеПереопределили метод в дочернем классеСвойства и.. Методы.....AirplaneHorseCarsЛегковушки Камазы ГудимСкоростьГрузоподъемностьКол-во ПасЕхать ПоворачиватьСвойства и МетодыTransportПрыгаемЛетимБибикаем
Статические методы
Статические методы в Python – это обычные функции, помещенные в класс (для удобства) чтоб те находились в пространстве имен этого класса.
Это как положить единственную книгу жанра «фантастика» на полку с научными книгами. И то и другое – книги. Класс один и тот же ведь? Верно.
И вы всегда знаете где эту книгу искать.
Вообще, если в теле метода не используется self (то есть ссылка на конкретный объект) следует задуматься, чтобы сделать метод статическим.Методы класса
Поскольку методы класса имеют доступ только к аргументу cls, Они могут менять состояние класса, что отразится на всех объектах этого класса, но не могут менять конкретный объект.Методы класса
Это сложный пример.
В интернете можно встретить примеры такого использования. Мы, например, вызываем функцию from_string (которая является методом класса) и которая внутри себя обращается к своему классу, тем самым передавая ему нужны параметры, для создания объекта, которые предварительно подготовила сама функция. После отработки метода __ init __ - возвращает объект.Можно сказать, что таких функций у объекта может быть несколько, и каждая будет создавать объект по своим правилам.
Специальные методы
Используйте __new__, когда вам нужно контролировать создание нового экземпляра.
Используйте __init__, когда вам нужно контролировать инициализацию нового экземпляра.
__new__— это первый шаг создания экземпляра. Он вызывается САМЫМ первым и отвечает ЗА ВОЗВРАТ нового экземпляра вашего класса.
Напротив, __init__ничего не возвращает; он отвечает только за инициализацию экземпляра после его создания.
Вам не понадобится __new__, если только вы не создаете подклассы неизменяемого типа, такого как str, int, unicode или tuple.
Специальные методы… Да их еще много)
Вот метод _ _del_ _Специальные методы…
Самое важное:
- Если захотите свой Многозначный тип данных сотворить, то не забудьте добавить ему подсчет длинны и другие плюшки..
- __getItem__ – реализация синтаксиса obj[key], получение значения по ключу;
- __setItem__ – установка значения для ключа;
- __delItem__ – удаление значения;
- __contains__ – проверка наличия значения.
Три белых коня… кхм.. Три главных принципа ООП
- Инкапсуляция – (Информация о каждом объекте принадлежит только этому объекту)
- Наследование – Всё и вся можно наследовать. Если класс наследуется от другого класса, то он имеет доступ к методам и свойствам того класса от которого наследуется.
- Полиморфизм - ….