Menu
Coddy logo textTech

Введение в магические методы

Часть раздела 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() и операторами, делая ваши классы более «питоничными» и интуитивно понятными в использовании.

challenge icon

Задание

Легко

В этом испытании вам предстоит реализовать класс 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
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Object Oriented Programming