This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Switch branches/tags
Branches Tags
Could not load branches
Nothing to show
Could not load tags
Nothing to show
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Cancel Create
- Local
- Codespaces
HTTPS GitHub CLI
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more about the CLI.
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Первые шаги в ООП: класс, объект, self
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
Latest commit message
Commit time
readme.md
Домашнее задание к занятию «ООП: наследование и полиморфизм»
# Задача 1. Фигуры. Количество сторон В этом задании вы построите первую простую иерархию классов для заданной предметной области.
Предметная область выглядит следующим образом: есть сущность фигура. Фигуры бывают двух типов: треугольник и четырёхугольник. У фигуры есть количество сторон. Для неизвестной фигуры будем считать это количество равным нулю. У треугольника три стороны, у четырёхугольника четыре стороны.
У любой фигуры мы хотим узнавать количество её сторон, но мы не должны быть способны изменить количество сторон для заданной фигуры извне.
Задача: спроектировать и реализовать классы, описывающие предметную область. Продемонстрируйте их работу: создайте по одному экземпляру каждого класса и выведите информацию о количестве его сторон на консоль.
Пример работы программы
Количество сторон: Фигура: 0 Треугольник: 3 Четырёхугольник: 4
Не читайте этот раздел сразу. Попытайтесь сначала решить задачу самостоятельно 🙂
Что использовать для решения.
Вам нужно создать три класса: для фигуры, треугольника и четырёхугольника. Назовём их Figure , Triangle и Quadrangle .
Классы Triangle и Quadrangle будут наследовать класс Figure .
Для хранения информации о количестве сторон создайте поле sides_count в классе Figure . Оно будет защищённым, чтобы нельзя было изменить его извне, но можно изменить значение в наследниках. Либо оно может быть приватным, и тогда вам нужно передавать информацию о количестве сторон через конструктор.
Для доступа к информации о количестве сторон создайте публичный метод get_sides_count в классе Figure . Он будет унаследован обоими фигурами.
Дружественные функции и классы пример. Для чего используются. Как определяются. Для двух классов #88
Для правильной инициализации информации о количестве сторон создайте конструкторы в классах, в которых присвойте нужное значение полю sides_count . Если вы сделали sides_count защищённым, можете присвоить значение прямо в конструкторе. Если приватным, то нужно создать в классе Figure защищённый конструктор с параметром (количество сторон) и публичный конструктор без параметров, который будет вызывать свой защищённый конструктор с параметром. Защищённый конструктор должны будут вызывать дочерние классы в своих публичных конструкторах без параметров.
Также для удобства вывода названия фигуры можно создать защищённое поле name в классе Figure с соответствующим методом get_name и заполнением значения в каждом классе. В Figure это будет «Фигура» и т. д.
# Задача 2. Фигуры. Стороны и углы В этом задании вы усложните иерархию классов для усложнённой предметной области.
У вас появляется информация о длине сторон и углах ваших фигур, а также несколько более конкретных фигур. Теперь в треугольнике вы должны хранить информацию о длине всех его трёх сторон ( a , b , c ) и значениях его трёх углов ( A , B , C ). В четырёхугольнике вы храните информацию о длине его четырёх сторон ( a , b , c , d ) и значениях его четырёх углов ( A , B , C , D ).
Также у вас появляются более конкретные фигуры:
- прямоугольный треугольник (угол C всегда равен 90);
- равнобедренный треугольник (стороны a и c равны, углы A и C равны);
- равносторонний треугольник (все стороны равны, все углы равны 60);
- прямоугольник (стороны a , c и b , d попарно равны, все углы равны 90);
- квадрат (все стороны равны, все углы равны 90);
- параллелограмм (стороны a , c и b , d попарно равны, углы A , C и B , D попарно равны);
- ромб (все стороны равны, углы A , C и B , D попарно равны).
Вы должны иметь возможность узнать у каждой фигуры длины её сторон и значения её углов, но извне вы не должны быть способны изменить длины сторон и углы.
Не должно быть возможности создать фигуры, не удовлетворяющие перечисленным условиям. Например, нельзя создать квадрат с разными углами. Геометрические соотношения проверять не нужно. Например, сумма углов в треугольнике может быть не равна 180.
Задача: спроектировать и реализовать классы, описывающие предметную область. Продемонстрируйте их работу: создайте по одному экземпляру каждой фигуры и выведите на экран информацию о длинах её сторон и величине её углов. Значения используйте произвольные.
Инициализацию длин сторон и величин углов нужно выполнить с помощью вызова базовых конструкторов.
Для вывода информации о фигуре создайте функцию print_info , которая будет принимать в качестве аргумента указатель на базовый класс фигуры.
Пример работы программы
Треугольник: Стороны: a=10 b=20 c=30 Углы: A=50 B=60 C=70 Прямоугольный треугольник: Стороны: a=10 b=20 c=30 Углы: A=50 B=60 C=90 Равнобедренный треугольник: Стороны: a=10 b=20 c=10 Углы: A=50 B=60 C=50 Равносторонний треугольник: Стороны: a=30 b=30 c=30 Углы: A=60 B=60 C=60 Четырёхугольник: Стороны: a=10 b=20 c=30 d=40 Углы: A=50 B=60 C=70 D=80 Прямоугольник: Стороны: a=10 b=20 c=10 d=20 Углы: A=90 B=90 C=90 D=90 Квадрат: Стороны: a=20 b=20 c=20 d=20 Углы: A=90 B=90 C=90 D=90 Параллелограмм: Стороны: a=20 b=30 c=20 d=30 Углы: A=30 B=40 C=30 D=40 Ромб: Стороны: a=30 b=30 c=30 d=30 Углы: A=30 B=40 C=30 D=40
Не читайте этот раздел сразу. Попытайтесь сначала решить задачу самостоятельно 🙂
Что использовать для решения.
Нужно создать класс для каждой фигуры.
Иерархия наследования для более конкретных фигур может различаться. Например, параллелограмм будет наследоваться от четырёхугольника, прямоугольник и ромб — от параллелограмма. Было бы логично квадрат унаследовать от ромба и прямоугольника, ведь он является и тем, и другим. Но вы помните, что стоит избегать множественного наследования, поэтому унаследуйте его либо от прямоугольника, либо от ромба на ваше усмотрение.
Для хранения информации о длинах сторон и величинах углов создайте поля a , b , c и A , B , C в классе треугольника и соответствующие им get_ методы, а в классе четырёхугольника создайте поля a , b , c , d и A , B , C , D и соответствующие им get_ методы.
У вас появятся разные конструкторы. Например, у конструктора класса треугольника будет 6 параметров — три для длин сторон и три для углов. У конструктора класса прямоугольного треугольника будет 5 параметров — угол C у него всегда равен 90. У класса равностороннего треугольника конструктор будет принимать только один параметр — это длина его сторон.
# Задача 3. Фигуры. Методы В этом задании вы добавите в вашу иерархию классов больше функциональности.
Теперь ваши фигуры должны уметь немного больше:
- выводить информацию о себе;
- проверять правильность своих данных.
- фигура (количество сторон равно 0);
- треугольник (стороны и углы произвольные, количество сторон равно 3, сумма углов равна 180);
- прямоугольный треугольник (угол C всегда равен 90);
- равнобедренный треугольник (стороны a и c равны, углы A и C равны);
- равносторонний треугольник (все стороны равны, все углы равны 60);
- четырёхугольник (стороны и углы произвольные, количество сторон равно 4, сумма углов равна 360);
- прямоугольник (стороны a , c и b , d попарно равны, все углы равны 90);
- квадрат (все стороны равны, все углы равны 90);
- параллелограмм (стороны a , c и b , d попарно равны, углы A , C и B , D попарно равны);
- ромб (все стороны равны, углы A , C и B , D попарно равны).
Вы должны иметь возможность попросить фигуру вывести информацию о себе на консоль, а также узнать, является ли фигура правильной, то есть выполняются ли условия, указанные в списке выше.
Информация о фигуре включает в себя:
- название фигуры;
- количество сторон;
- длины её сторон, если есть;
- величины её углов, если есть;
- является ли фигура правильной.
Задача: спроектировать и реализовать классы, описывающие предметную область. Продемонструйте их работу: создайте по одному экземпляру каждой фигуры и выведите на экран информацию о фигурах.
Реализуйте методы вывода на консоль и проверки правильности фигуры с помощью виртуальных функций и переопределений. Используйте вызов базовой версии метода.
Ваша задача — работать с экземплярами дочерних классов полиморфно, то есть с помощью указателя на базовый класс.
Пример работы программы
Фигура: Правильная Количество сторон: 0 Треугольник: Правильная Количество сторон: 3 Стороны: a=10 b=20 c=30 Углы: A=50 B=60 C=70 Прямоугольный треугольник: Неправильная Количество сторон: 3 Стороны: a=10 b=20 c=30 Углы: A=50 B=60 C=90 Прямоугольный треугольник: Правильная Количество сторон: 3 Стороны: a=10 b=20 c=30 Углы: A=50 B=40 C=90 Равнобедренный треугольник: Неправильная Количество сторон: 3 Стороны: a=10 b=20 c=10 Углы: A=50 B=60 C=50 Равносторонний треугольник: Правильная Количество сторон: 3 Стороны: a=30 b=30 c=30 Углы: A=60 B=60 C=60 Четырёхугольник: Неправильная Количество сторон: 4 Стороны: a=10 b=20 c=30 d=40 Углы: A=50 B=60 C=70 D=80 Прямоугольник: Правильная Количество сторон: 4 Стороны: a=10 b=20 c=10 d=20 Углы: A=90 B=90 C=90 D=90 Квадрат: Правильная Количество сторон: 4 Стороны: a=20 b=20 c=20 d=20 Углы: A=90 B=90 C=90 D=90 Параллелограмм: Неправильная Количество сторон: 4 Стороны: a=20 b=30 c=20 d=30 Углы: A=30 B=40 C=30 D=40 Ромб: Неправильная Количество сторон: 4 Стороны: a=30 b=30 c=30 d=30 Углы: A=30 B=40 C=30 D=40
Не читайте этот раздел сразу. Попытайтесь сначала решить задачу самостоятельно 🙂
Что использовать для решения.
Вам нужно создать в классе фигуры два виртуальных метода — void print_info() и bool check() . Для фигуры будет выводиться только информация об имени, правильности и количестве сторон. Для треугольника и четырёхугольника добавится информация о длине сторон и величине углов. Чтобы не дублировать код, используйте в переопределении метода print_info базовую версию из класса фигуры.
Метод check будет переопределяться в каждом классе, так как у каждой фигуры в иерархии наследования добавляются новые условия. Чтобы не терять результаты проверки из класса родителя и не дублировать код, вызывайте базовую версию метода check . Таким образом, вам нужно проверить сумму углов в треугольнике только в классе треугольника, наследникам нужно проверить только свои условия и вызвать базовую версию из класса треугольник. А вот в классе треугольник вызывать базовую версию не надо, потому что класс фигура проверяет количество сторон на равенство нулю, а в классе треугольник и в наследниках их будет 3.
Источник: github.com
Простое объяснение методов класса, экземпляра класса и статических методов в Python
Перевод статьи «Python’s Instance, Class, and Static Methods Demystified».
В этой статье я постараюсь объяснить, что стоит за методами класса, статическими методами и обычными методами экземпляра класса.
Если вы сможете достигнуть интуитивного понимания разницы между этими методами, вы также сможете писать объектно-ориентированный код на Python. Такой код проще для понимания, а в долгосрочной перспективе его легче поддерживать.
Обзор статических методов, методов класса и экземпляра класса
Давайте начнем с написания класса (на Python 3), который будет содержать простые примеры методов всех трех видов:
Методы экземпляра класса
Первый метод в MyClass, под названием method, это обычный метод экземпляра класса. Это самый базовый вид методов, которым вы будете пользоваться чаще всего. Как видите, этот метод принимает один параметр (self), который при вызове метода указывает на экземпляр MyClass (хотя методы могут принимать и больше одного параметра).
При помощи параметра self методы экземпляра класса могут иметь свободный доступ к атрибутам и другим методам того же объекта. Благодаря этому они на многое способны, когда речь заходит о модификации состояния объекта.
Методы экземпляра также могут иметь доступ к самому классу — при помощи атрибута self.__class__. Это означает, что они могут менять состояние не только объекта, но и класса.
Методы класса
Методы класса вместо параметра self принимают параметр cls. Этот параметр при вызове метода указывает не на экземпляр объекта, а на класс.
Поскольку метод класса имеет доступ только к аргументу cls, он не может изменять состояние экземпляра объекта. Для этого нужен доступ к self. Но, тем не менее, методы класса могут изменять состояние класса в целом, что затронет и все экземпляры этого класса.
Статические методы
Методы такого типа не принимают в качестве параметра ни self, ни cls (хотя, безусловно, они свободно могут принимать другие параметры в любых количествах).
Таким образом, статический метод не может изменять состояние ни объекта, ни класса. Виды данных, которые могут принимать статические методы, ограничены. Эти методы помещаются в класс, просто чтобы они находились в пространстве имен этого класса, т. е., для организационных целей.
Давайте посмотрим, как все это работает!
Пока что все изложенное было чистой теорией. Но я считаю, что вы должны научиться интуитивно улавливать разницу между методами на практике. Сейчас мы разберем несколько более конкретных примеров.
Давайте посмотрим, как все эти методы ведут себя, когда мы их вызываем. Начнем с создания экземпляра класса, а затем вызовем все три метода.
В MyClass реализация каждого метода возвращает сведения, благодаря которым мы можем понимать, к каким частям класса или объекта может иметь доступ метод, а также отслеживать происходящее.
Вот что происходит при вызове метода экземпляра класса:
>>> obj = MyClass() >>> obj.method() (‘instance method called’, )