ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 25.10.2023
Просмотров: 32
Скачиваний: 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 раз?
Создать дополнительный список объектов
Ну.. Плодить функции Атаки и делать проверку на то, какое у кого оружие.
А не кажется ли.. Что мы загоняем себя в угол?
А не кажется ли.. Что мы загоняем себя в угол?
Можно же сделать всё проще и не страдать.
И наши списки – делятся на классы
И более того, objects_All
это класс родительский,
а objects, objects_shield и objects_On_All – наследники
objects_All
objects
objects_shield
objects_On_All
Враг1
Враг_Х
Враг99
Враг_У
Hero
…
…
objects_All
objects
Враг1
Враг_Х
objects_shield
Враг99
Враг_У
objects_
On_All
Hero
…
…
Объекты
Можно подойти к архитектуре приложения с другой стороны и рассматривать сущности, которые есть в вашей программе, как отдельные объекты, каждый из которых может обращаться к общим функциям (методам), иметь свои свойства и события.При первом рассмотрении можно сделать так:
- Создаем два класса
- В каждом классе есть функция
_ _ init _ _ - Которая отвечает за инициализацию (Создание) Экземпляра класса (То есть объекта)
Она вызывается автоматически, когда мы делаем подобное:
X = NPC() или Y = Hero()
(так мы создаем объекты)
3) Параметр self – очень важен, он и создает всю эту магию.
Если по простому, то self это ссылка на наш конкретный объект
А при втором рассмотрении…
Можно подумать еще
Разберем пример с транспортом
Общий класс «Транспорт»
Наследники класса «Транспорт»
Наследники класса «Машины», который в свою очередь наследуется от класса «Транспорт»
Общий класс «Транспорт»
Наследники класса «Транспорт»
Наследники класса «Машины», который в свою очередь наследуется от класса «Транспорт»
Обратите внимание, все свойства и функции (Методы) наследуются от родителя.
Кроме тех, которые мы переопределили в дочернем классе
Переопределили метод в дочернем классе
Свойства и..
Методы.....
Airplane
Horse
Cars
Легко
вуш
ки
Камазы
Гудим
Скорость
Грузоподъемность
Кол-во Пас
Ехать
Поворачивать
Свойства и Методы
Transport
Прыгаем
Летим
Бибикаем
Статические методы
Статические методы в Python – это обычные функции, помещенные в класс (для удобства) чтоб те находились в пространстве имен этого класса.
Это как положить единственную книгу жанра «фантастика» на полку с научными книгами. И то и другое – книги. Класс один и тот же ведь? Верно.
И вы всегда знаете где эту книгу искать.
Вообще, если в теле метода не используется self (то есть ссылка на конкретный объект) следует задуматься, чтобы сделать метод статическим.
Методы класса
Поскольку методы класса имеют доступ только к аргументу cls, Они могут менять состояние класса, что отразится на всех объектах этого класса, но не могут менять конкретный объект.Методы класса
Это сложный пример.
В интернете можно встретить примеры такого использования. Мы, например, вызываем функцию from_string (которая является методом класса) и которая внутри себя обращается к своему классу, тем самым передавая ему нужны параметры, для создания объекта, которые предварительно подготовила сама функция. После отработки метода __ init __ - возвращает объект.Можно сказать, что таких функций у объекта может быть несколько, и каждая будет создавать объект по своим правилам.
Специальные методы
Используйте __new__, когда вам нужно контролировать создание нового экземпляра.
Используйте __init__, когда вам нужно контролировать инициализацию нового экземпляра.
__new__— это первый шаг создания экземпляра. Он вызывается САМЫМ первым и отвечает ЗА ВОЗВРАТ нового экземпляра вашего класса.
Напротив, __init__ничего не возвращает; он отвечает только за инициализацию экземпляра после его создания.
Вам не понадобится __new__, если только вы не создаете подклассы неизменяемого типа, такого как str, int, unicode или tuple.
Специальные методы… Да их еще много)
Вот метод _ _del_ _
Специальные методы…
Самое важное:
- Если захотите свой Многозначный тип данных сотворить, то не забудьте добавить ему подсчет длинны и другие плюшки..
Так же можно работать и с этими методами. Но не будем забегать так далеко, там и списков/кортежей/словарей хватает)
- __getItem__ – реализация синтаксиса obj[key], получение значения по ключу;
- __setItem__ – установка значения для ключа;
- __delItem__ – удаление значения;
- __contains__ – проверка наличия значения.
_ _ dir _ _ - Этот метод возвращает пользователю список атрибутов объекта
Три белых коня… кхм.. Три главных принципа ООП
- Инкапсуляция – (Информация о каждом объекте принадлежит только этому объекту)
- Наследование – Всё и вся можно наследовать. Если класс наследуется от другого класса, то он имеет доступ к методам и свойствам того класса от которого наследуется.
- Полиморфизм - ….
Инкапсуляция
Грузить не буду. Тут потом добавится информация о _ и _ _ .
Благодаря которым, можно создать некоторую приватность, но она в Python существует только на словах. (В договоренностях)
Наследование
Множественное (2 и более родителя)
Одиночное (1 родитель, не важно у скольких наследников)