Файл: Ооп и зачем оно нам Просто об объектах.pptx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 25.10.2023

Просмотров: 33

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

СОДЕРЖАНИЕ

ООП и зачем оно нам?

Просто об объектах

Помним, что в Python всё является объектами?

Примеры объектов в языке:

Вспомним про функции и для чего они нужны

Функции

Функции – это по сути программки внутри программы.

На деле можно делать и так:

Объекты

При первом рассмотрении можно сделать так:

А при втором рассмотрении…

Можно подумать еще

Разберем пример с транспортом

Статические методы

Статические методы в Python – это обычные функции, помещенные в класс (для удобства) чтоб те находились в пространстве имен этого класса. 

Это как положить единственную книгу жанра «фантастика» на полку с научными книгами. И то и другое – книги. Класс один и тот же ведь? Верно.

И вы всегда знаете где эту книгу искать.

Методы класса

Методы класса

Это сложный пример.

Можно сказать, что таких функций у объекта может быть несколько, и каждая будет создавать объект по своим правилам.

Специальные методы

Используйте __new__, когда вам нужно контролировать создание нового экземпляра.

Используйте __init__, когда вам нужно контролировать инициализацию нового экземпляра.

__new__— это первый шаг создания экземпляра. Он вызывается САМЫМ первым и отвечает ЗА ВОЗВРАТ нового экземпляра вашего класса.

Напротив, __init__ничего не возвращает; он отвечает только за инициализацию экземпляра после его создания.

Вам не понадобится __new__, если только вы не создаете подклассы неизменяемого типа, такого как str, int, unicode или tuple.

Специальные методы… Да их еще много)

Специальные методы…

Самое важное:

Три белых коня… кхм.. Три главных принципа ООП

Инкапсуляция

Наследование

Полиморфизм

Слово сильное и, возможно страшное.

А обозначает лишь возможность переопределения методов у наследников. Это есть в примере про машинки 

(от греч. 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 родитель, не важно у скольких наследников)

Полиморфизм

Слово сильное и, возможно страшное.

А обозначает лишь возможность переопределения методов у наследников. Это есть в примере про машинки 

(от греч. polymorphes многообразный)

На этом всё, спасибо за внимание!

Программный пример