ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 25.10.2023
Просмотров: 69
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
СОДЕРЖАНИЕ
Добавим метод, который будет возвращать нам рост объекта
Но мы не можем просто так написать:
Так как методы, закрепляются за классами.
Соответственно, надо писать примерно так: (но все равно будет ошибка)
Помним про обязательные параметры функций? Правильно, вот он, обязательный параметр – ссылка на объект.
Продолжим.
Если мы напишем так, то всё заработает. Метод «get_рост» есть в классе Man и мы так же передаем ему ссылку на объект «Вася»
Но зачем нам помнить, в каком классе у нас какие объекты? Ведь их может быть тысяча, десят тысяч, или миллион объектов.. Каждый объект сам знает к какому классу он принадлежит.
По этому мы можем писать вот так:
Когда мы пишем Объект . Метод() то получаем -> Класс . Метод ( Объект )
Это можно воспринимать так, но Python (лично для себя) воспримет это как:
Так как он знает, что Вася – это объект класса Man, а в классе Man есть метод get_рост( ) и всё теперь у нас будет хорошо)
Продолжаем Задание
Напишите методы получения ФИО, должности и Телефона (См. пример про get_рост) Сотрудников
И такие же методы Изменения ФИО, должности и Телефона (get – это получить, а set – установить) именуй методы правильно.
Поскольку мы освоились с методами, то вот, один пример из создания игрушки на Python:
Если нажимается клавиша A – идем Влево, иначе идем Вправо.
Тут В обоих случаях вызывается метод move ( ) и у него имеется необязательный параметр.
Вот как это выглядит в коде:
Метод сам по себе изменяет координату объекта, и мне не требуется какой-либо возврат, Но все равно, обязательно, возвращаю True
В дальнейшем, возможно, увеличение сложности этой функции, если добавлять всякие Перки, Умения, заклинания и прочее… Будет больше строчек.
Тут всё просто, я думаю вы и сами разберете эту одинокую строчку по составляющим.
Подсказка. Мы меняем координату X - Либо прибавляем к ней, либо отнимаем от нее.
Инкапсуляция. – Обожаю эти сложные слова…Но вы уже знаете, что это такое на практике, но не на словах.
Это понятие того, что один объект не может менять свойства другого объекта, так же как один класс, не может использовать методы другого класса (не считая наследования, но о нем ниже).
Если вспомнить наш пример ранее: Вася, может получить только свой Рост, Алексей свой рост, а Влад свой и никак иначе.
То есть объекты изолированы друг от друга. Если мы меняем свойство одного объекта, это никак не отражается на других объектах.
Картинка ниже полностью описывает ситуацию.
Ну вот определение из интернета.
Инкапсуляция — ограничение доступа к составляющим объект компонентам (методам и переменным). Инкапсуляция делает некоторые из компонент доступными только внутри класса
Наследование – Мы плавно шли к этой теме. Классы могут наследоваться друг от друга, причем двумя способами
-
Одиночное (1 родитель, не важно у скольких наследников)
-
Множественное (2 и более родителя)
Что нам это дает? Давайте вернемся, к примеру с классом «Человек»,
В коде прописаны комментарии, а также можно увидеть несколько методов у класса «Человек».
Чуть ниже него видим класс «Man» , который, какой-то пустой.. Однако, при создании Объекта класса Мужчина (последняя строчка кода) – мы вносим какие-то параметры… Тут вся магия заключается в скобочках.
Посмотрим внимательно на сам класс «Мужчина»
Мы сообщаем, что Наследуем класс «Man» от класса «Human» (голубой цвет на скриншоте)
Мужчина — это же человек.. Логично? Логично.
И тут происходит «магия» Поскольку в Классе «Man» пусто… и нету Метода __init__ то, Python в поисках этого метода, обращается к тому классу, от которого наследуется «Man» к классу «Humаn».
Там он его находит и Создает объект.
Если сделать так:
То будет ошибка, По ней прям отчетливо видно, что обращение идет к классу «Human»
Так как запрашивается рост и вес.
Идем дальше. А что если…. Я хочу…Еще и женщин добавить?
Вот добавляем:
Свойства «Пол» не будет у класса «Human» По крайней мере по нашей задумке.
Так мы унаследовали 1, а потом 2 класса от третьего класса.
Теперь давайте попробуем наоборот. От множества классов, унаследуем один (ну или несколько, это не важно)
Что тут может быть интересно… Ребенок создается по той же логике что и предыдущие два класса, однако цепочка до метода __init__ тут длиннее.
-
Сначала python смотрит есть ли __init__ в «Child» - Нету -
Потом смотрит в Man – нету \ именно в таком -
Потом смотрит в Women – нету. / порядке (слева направо) -
Потом идет в «Human»
Само наследование выглядит вот так.
А Python ищет методы от обратного. Сначала у ближайших родителей. Потом у дальних.
То есть получается вот так, если рисовать:
Что последовательность именно такая легко проверить:
-
Например, если мы добавим метод инициализации в класс «Женщина»? В который ничего не нужно будет добавлять, то и «Ребенок» при создании ничего не запросит.
То есть в «Woman» метод __init__ будет искаться раньше, чем, в «Human»
Однако остается вопрос, почему до этого в схеме мной нарисованы стрелочки конкретно к классу «Man» …
Все просто: этот класс при наследовании стоит первым. (порядок имеет значение)
Теперь определение наследования
Наследование позволяет создавать новый класс на основе уже существующего класса. Наряду с инкапсуляцией наследование является одним из краеугольных камней объектно-ориентированного программирования. Ключевыми понятиями наследования являются подкласс и суперкласс.
О Супер классах поговорим позже.
А что если я хочу что-нибудь поменять у наследников… То тут на помощь приходит:
Полиморфизм – Возможность изменять методы в классах-наследниках. Это можно было заметить еще на примере выше, когда мы добавили __init__ к классу «Woman» и он собой перекрыл __init__ класса родителя, то есть «Human».
Полиморфизм - разное поведение одного и того же метода в разных классах. Например, мы можем сложить два числа, и можем сложить две строки. При этом получим разный результат, так как числа и строки являются разными классами. Но наследуются они, все же от одного и того же родительского класса.
Рассмотрим на примере.
У родителя и у ребенка, есть метод «jump» однако работает он у обоих по-разному. Это все происходит из-за того самого механизма поиска метода, для которого я рисовал схемы.
Если метод не находится в классе объекта, то он ищется в классах – родителях. Если он нашелся в классе самого объекта, то он выполняется и больше ничего не ищется.
Все просто.
Задания.
-
Попробуйте придумать, каких-нибудь здравых наследников классу «Сотрудник» (тот, что мы делали выше) (Если таковых нет, то ответьте «нет» и обоснуйте)
-
Попробуйте создать несколько своих классов, с наследованием. И парой методов.
Например, класс «Country» или «Technics», или «mobile», ну или сами придумайте.
Совет, разбираться с наследованием, проще на бумаге. Так что не спешите печатать код, лучше сначала порисовать.
В наследовании должна быть четкая логика.
Суть наследования в том, что потомкам не нужно писать(прописывать) методы, которые есть у родителей, но при этом, при необходимости родительские методы можно заменять, прописав детям собственные методы.
Пара задач из инета.
-
Напишите программу с классом Student, в котором есть три атрибута: name, groupNumber и age. По умолчанию name = Ivan, age = 18, groupNumber = 10A. Необходимо создать пять методов: getName, getAge, getGroupNumber, setNameAge, setGroupNumber. Метод getName нужен для получения данных об имени конкретного студента, метод getAge нужен для получения данных о возрасте конкретного студента, vетод setGroupNumberнужен для получения данных о номере группы конкретного студента. Метод SetNameAge позволяет изменить данные атрибутов установленных по умолчанию, метод setGroupNumber позволяет изменить номер группы установленный по умолчанию. В программе необходимо создать пять экземпляров класса Student, установить им разные имена, возраст и номер группы. -
Напишите программу с классом Math. Создайте два атрибута — a и b. Напишите методы addition — сложение, multiplication — умножение, division — деление, subtraction — вычитание. При передаче в методы параметров a и b с ними нужно производить соответствующие действия и печатать ответ.