Класс Python — Упражнения, практика, решение
3. Напишите класс Python, чтобы найти правильность строки скобок, ‘(‘, ‘)’, », ‘[‘ и ‘]. Эти скобки должны быть закрыты в правильном порядке, например, «()» и «() [] <>» допустимы, но «[)», «(
4. Напишите класс Python, чтобы получить все возможные уникальные подмножества из набора различных целых чисел. — Перейти к редактору
Вход: [4, 5, 6]
Вывод: [[], [6], [5], [5, 6], [4], [4, 6], [4, 5], [4, 5, 6]]
5. Напишите класс Python, чтобы найти пару элементов (индексы двух чисел) из данного массива, сумма которых равна конкретному целевому числу. — Перейти к редактору
Ввод: цифры = [10,20,10,40,50,60,70], цель = 50
Выход: 3, 4
6. Напишите класс Python, чтобы найти три элемента, которые суммируют до нуля из набора из n действительных чисел. — Перейти к редактору
Входной массив: [-25, -10, -7, -3, 2, 4, 8, 10]
Выход: [[-10, 2, 8], [-7, -3, 10]]
7. Напишите класс Python для реализации pow (x, n). — Перейти к редактору
8. Напишите класс Python, чтобы поменять строку слово за словом. — Перейти к редактору
Входная строка: ‘привет. Py’
Ожидаемый результат: ‘.py hello’
9. Напишите класс Python, который имеет два метода get_String и print_String. get_String принимает строку от пользователя и print_String печатает строку в верхнем регистре. — Перейти к редактору
Нажмите меня, чтобы увидеть решение
10. Напишите класс Python с именем Rectangle, построенный по длине и ширине, и метод, который будет вычислять площадь прямоугольника. — Перейти к редактору
Нажмите меня, чтобы увидеть решение
11. Напишите класс Python с именем Circle, построенный по радиусу, и два метода, которые будут вычислять площадь и периметр круга. — Перейти к редактору
Нажмите меня, чтобы увидеть решение
12. Напишите программу на Python, чтобы получить имя класса экземпляра в Python. — Перейти к редактору
Нажмите меня, чтобы увидеть решение
Редактор кода Python:
Еще не все !
Не отправляйте решение вышеупомянутых упражнений здесь, если вы хотите внести вклад, перейдите на соответствующую страницу упражнения.
[ Сборник задач ]Тема 13. Классы и объекты
Рассмотрим специфику ООП в Python, структуру класса и вызов его экземпляров. Определим особенности методов и свойств классов. Ознакомимся с основными магическими методами ( __str__ , __repr__ , __gt__ , __slots__ и др.). Научимся модифицировать атрибуты в плане приватности доступа к ним.
Объектно-ориентированное программирование (ООП) – один из подходов к реализации программного кода для проецирования сущностей реального мира. Считается, что введение классов и объектов упрощает понимание кода человеком. В Питоне все является объектами.
- Принципы ООП и их реализация в Python;
- Свойства и методы классов;
- Инициализация экземпляров классов;
- Получение и задание свойств через декораторы;
- Классовые и статические методы;
- Магические ( dunder или magic ) методы классов;
- Модификаторы доступа к методам и свойствам;
- Дескрипторы.
Читайте также
Поговорим про основные принципы объектно-ориентированного программирования: абстракцию, инкапсуляцию, наследование и полиморфизм. Научимся создавать классы и объекты классов в Python. Рассмотрим, чем отличаются понятия поля, свойства, методы и атрибуты класса. Изучим особенности организации уровней доступа к атрибутам: Public, Protected и Private.
Классы – шаблоны ( blueprint ) конкретных объектов, т.е. на их основе создаются экземпляры, наследующие свойства и методы родителей.
ООП в языке Python базируется на следующей иерархии:
1. Имеется головной класс object() , являющийся основой для всех других (обычно, его явно не указывают);
2. Уровнем ниже расположены метаклассы , классы и подклассы (как самого Питона, так и пользовательские);
3. В результате получаем возможность создавать любое количество экземпляров классов, т.е. объектов.
А вообще говоря — все в Питоне является объектом (даже класс). Это просто нужно запомнить.
Так как на основе классов создаются конкретные объекты, необходима возможность получения доступа к каждому из них. Ключевое слово self обозначает текущий объект класса. Это некая договоренность (так как self никто не запрещает заменить на любое другое слово).
- В качестве первого аргумента у методов экземпляра класса;
- Для доступа к свойству объекта внутри класса.
Результат выполнения
—
Привет, Дмитрий
- Методы экземпляров (наиболее часто используемые, в качестве первого аргумента всегда принимают self );
- Классовые методы (здесь первым параметром передается cls . Привязаны к данному классу, а не к его экземплярам. Способны менять состояние класса, но не его экземпляров);
- Статические методы (не требуют наличия особого первого аргумента. Фактически, не принадлежат никакому классу, а представляют собой независимую функцию, которую мы решили по причинам бизнес-логики включить в класс).
Пример – IDE
—
class Person:
____def __init__(self, name):
________self.name = name
____@staticmethod
____def status(year_of_birth):
________if 2021 — year_of_birth >= 18:
____________print(‘Вы можете смотреть все страницы сайта’)
________else:
____________print(‘Часть страниц вам не доступна’)
student = Person(‘Петр’)
# Тесты
student.status(1991)
Person.status(2011)
Результат выполнения
—
Вы можете смотреть все страницы сайта
Часть страниц вам не доступна
Фактические, метод status() никто не мешает нам вынести за рамки класса, но мы его тут разместили для изоляции и удобства.
Наследование – один из основных принципов ООП. Его суть выражается в следующем: на основании одних классов (базовых, суперклассов) можно создавать другие (подклассы), наследующие их свойства и методы.
- Нет нужды переписывать одни и те же методы и свойства у разных объектов;
- Методы и свойства наследников не запрещено дополнять или модифицировать.
Пример – IDE
—
class Bird:
____def __init__(self, age, fly_distance):
________self.age = age
________self.fly_distance = fly_distance
____def fly(self):
________print(f»Птица может пролететь за раз километров: «)
____def human_age(self):
________print(f’Этой птице человеческих лет’)
____def __init__(self, age, fly_distance, sound):
________super().__init__(age, fly_distance)
________self.sound = sound
____def human_age(self):
________print(f’Данному воробью человеческих лет’)
____def sing(self):
________print(self.sound)
# Тесты
crow = Bird(11, 5)
crow.fly()
crow.human_age()
young_sparrow = Sparrow(1, 2, ‘чик-чирик’)
old_sparrow = Sparrow(3, 1, ‘чирик-чирик’)
young_sparrow.fly()
young_sparrow.sing()
young_sparrow.human_age()
old_sparrow.human_age()
Результат выполнения
—
Птица пролетела километров: 5
Этой птице 66 человеческих лет
Птица пролетела километров: 2
чик-чирик
Данному воробью 25 человеческих лет
Данному воробью 75 человеческих лет
Функция super() позволяет ссылаться на родительский суперкласс. Класс Sparrow унаследовал от Bird метод fly() , затем дополнительно мы ему создали собственный метод sound() и изменили метод предка human_age() .
Очень часто переменные, инициализируемые в классе, являются однотипными. Например, есть класс Employee (сотрудник), принимающий параметры: имя, фамилия, отчество, должность. Все они являются строками. Следовательно, прежде чем создать экземпляр класса, нужно проверить, что пользователь ввел строки. А для этого потребуются сеттеры, проверяющие тип вводимых параметров. В итоге, мы 4 раза повторим код проверки. Нарушается принцип DRY ( don’t repeat yourself ).
Для таких ситуаций удобно использовать дескрипторы (они, к слову, широко применяются во фреймворке Django при создании моделей).
Дескриптор — такой атрибут объекта, поведение которого переопределяется специальными методами. Проще говоря, доступ к какому-то свойству экземпляра можно переопределить с учетом дополнительных проверок. Если делать эти верификации без дескрипторов, то один и тот же код начнет повторяться.
- __get__() — получить значение свойства;
- __set__() — задать значение;
- __delete__() — удалить атрибут;
- __set_name__() — присвоить имя свойству (появился в Питоне версии 3.6).
Покажем использование дескрипторов на вышеупомянутом примере.
Пример – IDE
—
# Создаем класс с протоколами дескриптора
class StringChecker:
____# Получаем доступ к свойству
____def __get__(self, instance, owner):
________if instance is None:
____________return self
________return instance.__dict__[self.name]
____# Меняем свойство
____def __set__(self, instance, str_value):
________if not isinstance(str_value, str):
____________raise ValueError(‘Нужно предоставить строку’)
________elif len(str_value) < 2:
____________raise ValueError(‘Необходимо минимум 2 буквы’)
________instance.__dict__[self.name] = str_value
____# Задаем имя свойства
____def __set_name__(self, owner, name):
________self.name = name
____# Определяем атрибуты (их может быть любое количество)
____name = StringChecker()
____surname = StringChecker()
____patronymic = StringChecker()
____post = StringChecker()
____# Инициализируем свойства с учетом требуемых проверок
____def __init__(self, name, surname, patronymic, post):
________self.name = name
________self.surname = surname
________self.patronymic = patronymic
________self.post = post
# Тесты
director = Employee(‘Иван’, ‘Николаевич’, ‘Прогин’, ‘Директор’)
print(director.__dict__)
director.name = 1
director.name = ‘A’
Результат выполнения
—
ValueError: Нужно предоставить строку
ValueError: Минимум две буквы в атрибуте требуется
Класс Python — Упражнения, практика, решение
3. Напишите класс Python, чтобы найти правильность строки скобок, ‘(‘, ‘)’, », ‘[‘ и ‘]. Эти скобки должны быть закрыты в правильном порядке, например, «()» и «() [] <>» допустимы, но «[)», «(
4. Напишите класс Python, чтобы получить все возможные уникальные подмножества из набора различных целых чисел. — Перейти к редактору
Вход: [4, 5, 6]
Вывод: [[], [6], [5], [5, 6], [4], [4, 6], [4, 5], [4, 5, 6]]
5. Напишите класс Python, чтобы найти пару элементов (индексы двух чисел) из данного массива, сумма которых равна конкретному целевому числу. — Перейти к редактору
Ввод: цифры = [10,20,10,40,50,60,70], цель = 50
Выход: 3, 4
6. Напишите класс Python, чтобы найти три элемента, которые суммируют до нуля из набора из n действительных чисел. — Перейти к редактору
Входной массив: [-25, -10, -7, -3, 2, 4, 8, 10]
Выход: [[-10, 2, 8], [-7, -3, 10]]
7. Напишите класс Python для реализации pow (x, n). — Перейти к редактору
8. Напишите класс Python, чтобы поменять строку слово за словом. — Перейти к редактору
Входная строка: ‘привет. Py’
Ожидаемый результат: ‘.py hello’
9. Напишите класс Python, который имеет два метода get_String и print_String. get_String принимает строку от пользователя и print_String печатает строку в верхнем регистре. — Перейти к редактору
Нажмите меня, чтобы увидеть решение
10. Напишите класс Python с именем Rectangle, построенный по длине и ширине, и метод, который будет вычислять площадь прямоугольника. — Перейти к редактору
Нажмите меня, чтобы увидеть решение
11. Напишите класс Python с именем Circle, построенный по радиусу, и два метода, которые будут вычислять площадь и периметр круга. — Перейти к редактору
Нажмите меня, чтобы увидеть решение
12. Напишите программу на Python, чтобы получить имя класса экземпляра в Python. — Перейти к редактору
Нажмите меня, чтобы увидеть решение
Редактор кода Python:
Еще не все !
Не отправляйте решение вышеупомянутых упражнений здесь, если вы хотите внести вклад, перейдите на соответствующую страницу упражнения.