Введение в магические методы
Часть раздела Object Oriented Programming путешествия по Python на Coddy — урок 33 из 64.
Магические методы (также называемые dunder-методами) — это специальные методы с двойным подчеркиванием в начале и в конце. Python вызывает их автоматически в ответ на определенные операции.
Вот пример класса с магическими методами:
class Book:
def __init__(self, title, author, pages):
self.title = title
self.author = author
self.pages = pages
def __str__(self):
return f"{self.title} by {self.author}"Метод __init__ вызывается автоматически при создании объекта:
my_book = Book("Python Programming", "John Smith", 350)Метод __str__ вызывается автоматически при преобразовании объекта в строку:
print(my_book) # Автоматически вызывает __str__
print(str(my_book)) # Также вызывает __str__Вывод:
Python Programming by John Smith
Python Programming by John SmithБез __str__ печать будет отображать адрес объекта в памяти:
class SimpleBook:
def __init__(self, title):
self.title = title
simple = SimpleBook("Test Book")
print(simple) # <__main__.SimpleBook object at 0x...>Добавьте еще один магический метод для определения длины:
class Book:
def __init__(self, title, author, pages):
self.title = title
self.author = author
self.pages = pages
def __str__(self):
return f"{self.title} by {self.author}"
def __len__(self):
return self.pages
my_book = Book("Python Programming", "John Smith", 350)
print(len(my_book)) # Автоматически вызывает __len__Результат:
350Ключевой момент: Магические методы начинаются и заканчиваются двойным подчеркиванием (__method__) и вызываются Python автоматически. Они позволяют вашим объектам работать со встроенными функциями, такими как str(), len() и операторами, делая ваши классы более «питоничными» и интуитивно понятными в использовании.
Задание
ЛегкоВ этом испытании вам предстоит реализовать класс Counter с использованием магических методов.
counter.py— это файл, который вам нужно отредактировать, он содержит комментарии TODO, которые помогут вам в реализацииdriver.py— содержит обширные тестовые случаи
Реализуйте класс Counter в counter.py и тестовые случаи в driver.py, следуя комментариям TODO. Класс должен поддерживать инициализацию с необязательными значениями, строковое представление и операции сложения.
Шпаргалка
Магические методы (dunder-методы) — это специальные методы с двойным подчеркиванием, которые Python вызывает автоматически в ответ на определенные операции.
Распространенные магические методы:
__init__- Вызывается при создании объекта__str__- Вызывается при преобразовании в строку с помощьюstr()илиprint()__len__- Вызывается при использовании функцииlen()
class Book:
def __init__(self, title, author, pages):
self.title = title
self.author = author
self.pages = pages
def __str__(self):
return f"{self.title} by {self.author}"
def __len__(self):
return self.pages
my_book = Book("Python Programming", "John Smith", 350)
print(my_book) # Автоматически вызывает __str__
print(len(my_book)) # Автоматически вызывает __len__Без __str__ при выводе на печать отображается адрес объекта в памяти вместо читаемого формата.
Попробуйте сами
# TODO: Импортируйте класс Counter из counter.py
# Используйте формат: from counter import Counter
# Комплексный обработчик тестовых случаев
test_case = input()
if test_case == "init_test":
# TODO: Протестируйте инициализацию со значением по умолчанию
# Создайте счетчик без аргументов и выведите его
# Ожидаемый результат: "Count: 0"
pass
elif test_case == "init_with_value":
# TODO: Протестируйте инициализацию с конкретным значением
# Создайте счетчик с начальным значением 10 и выведите его
# Примечание: print() неявно вызывает __str__, но здесь мы фокусируемся на тестировании __init__
# Ожидаемый результат: "Count: 10"
pass
elif test_case == "addition":
# TODO: Протестируйте операцию сложения
# Создайте счетчик со значением 3, прибавьте к нему 7 и выведите результат
# Ожидаемый результат: "Count: 10"
pass
elif test_case == "chained_addition":
# TODO: Протестируйте цепочку операций сложения
# Создайте счетчик со значением 1, прибавьте 2, затем прибавьте 3 к результату и выведите
# Ожидаемый результат: "Count: 6"
pass
elif test_case == "negative_values":
# TODO: Протестируйте работу с отрицательными значениями
# Создайте счетчик со значением -5 и выведите его
# Затем прибавьте к нему -3 и выведите результат
# Ожидаемые результаты: "Count: -5" и "Count: -8"
pass
elif test_case == "zero_value":
# TODO: Протестируйте работу с нулевыми значениями
# Создайте счетчик со значением 0, прибавьте 0 и выведите
# Ожидаемый результат: "Count: 0"
pass
elif test_case == "large_values":
# TODO: Протестируйте работу с большими значениями
# Создайте счетчик со значением 1000000 и прибавьте 9000000
# Ожидаемый результат: "Count: 10000000"
pass
elif test_case == "multiple_counters":
# TODO: Протестируйте взаимодействие между несколькими счетчиками
# Создайте counter1 со значением 5 и counter2 со значением 10
# Выведите оба счетчика
# Ожидаемые результаты: "Count: 5" и "Count: 10"
pass
elif test_case == "type_validation":
# TODO: Протестируйте сложение с разными типами
# Попробуйте прибавить float (2.5) к счетчику со значением 5
# Ожидаемый результат: "Count: 7.5"
passВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Object Oriented Programming
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыПараметр selfМетодыАтрибутыМетод-конструктор (__init__)Повторение — Простой калькулятор4Наследование
Базовое наследованиеФункция super()Переопределение методовМножественное наследованиеПорядок разрешения методовИтоги — Иерархия сотрудников7Специальные методы
Введение в магические методыПерегрузка операторовМагические методы контейнеровПовторение — Пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy5Полиморфизм
Снова о переопределении методовУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовИтоги — Калькулятор фигур8Продвинутые концепции ООП
Композиция против наследованияМиксиныСтатические методы и методы классаДекораторы классовМенеджеры контекста11Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн Компоновщик3Свойства классов
Переменные экземпляра и классаДекораторы свойствПриватные атрибутыИтоги — Менеджер банковского счета6Инкапсуляция
Public, Protected, Private члены классаМодификаторы доступаСокрытие данныхДекораторы property: продвинутый уровеньИтоги: Система учета студентов12Проект: Управление библиотекой
Обзор проектаКлассы Book и User