Similar presentations:
Магические методы (2)
1. Введение в ООП. Магические методы
2. Магические методы
Специальные методы в Python, начинающиеся изаканчивающиеся двойным подчеркиванием
(__method__).
Используются для реализации особого поведения
объектов.
Вызываются автоматически интерпретатором Python в
определённых ситуациях.
Примеры: __init__, __str__, __add__, __len__.
3. Магические методы
Пример: __init__ и __str__class Person:
def __init__(self, name):
self.name = name
def __str__(self):
return f"Person: {self.name}"
p = Person("Alice")
print(p) # Вывод: Person: Alice
4. Магические методы
__add__ (+), __sub__ (-),__mul__ (*), __truediv__
(/).
Позволяют определять
поведение для
арифметических
операций.
Пример: __add__
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y
def __add__(self, other):
return Vector(self.x + other.x, self.y
+ other.y)
def __str__(self):
return f"Vector({self.x}, {self.y})"
v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 + v2) # Вывод: Vector(4, 6)
5. Синглтоны
6. Синглтоны
Шаблон проектирования, гарантирующий существованиетолько одного экземпляра класса.
Обеспечивает глобальную точку доступа к этому экземпляру.
Используется для управления ресурсами (например,
подключение к БД).
7. Синглтоны
Пример: Реализация с помощью метаклассаclass Singleton:
_instance = None
def __new__(cls):
if cls._instance is None:
cls._instance = super().__new__(cls)
cls._instance.connection = "Connected"
return cls._instance
# Пример использования
db1 = Singleton()
db2 = Singleton()
print(db1 is db2) # Вывод: True – один экземпляр класса
print(db1.connection) # Вывод: Connected
print(db2.connection) # Вывод: Connected
8. Синглтоны
Метод __new__: Переопределяется для контроля создания экземпляра класса.
Проверяем, существует ли уже экземпляр (_instance). Если нет, создаём новый с
помощью super().__new__(cls) и сохраняем его в _instance.
Если экземпляр уже есть, возвращаем его, обеспечивая единственность
экземпляра.
Атрибут connection задаётся напрямую в __new__ для простоты (вместо __init__).
Этот подход проще, чем использование метакласса, так как не требует
дополнительного класса SingletonMeta. Он подходит для базовых случаев, когда
нужно гарантировать единственный экземпляр объекта.
9. Когда использовать Синглтоны?
•Управление общими ресурсами (логи, кэш,конфигурация).
•Когда требуется единая точка контроля.
•Осторожно: Может усложнить
тестирование и привести к скрытым
зависимостям.
10. Задачи
Базовая задача: __str__ для классаУсловие: Создайте класс Book с атрибутами title и author. Реализуйте
метод __str__, чтобы при вызове print(book) выводилась строка вида:
"Книга: {title}, Автор: {author}".
Пример вывода: Книга: Война и мир, Автор: Л.Н. Толстой
11. Задачи
Арифметические операции: __add__ Условие: Реализуйте классPoint с координатами x и y. Определите метод __add__, чтобы можно
было складывать две точки (p1 + p2), возвращая новую точку с суммой
координат.
Пример вывода: Point(1, 2) + Point(3, 4) = Point(4, 6)
12. Задачи
Сравнение: __eq__ Условие: В классе Point из предыдущей задачидобавьте метод __eq__, чтобы сравнивать точки по их координатам (p1
== p2 возвращает True, если координаты совпадают).
Пример вывода: Point(1, 2) == Point(1, 2) → True
13. Задачи
Длина объекта: __len__ Условие: Создайте класс Playlist с атрибутомsongs (список песен). Реализуйте метод __len__, чтобы len(playlist)
возвращал количество песен в плейлисте.
Пример вывода: Если в плейлисте 5 песен, len(playlist) → 5
14. Задачи
Индексация: __getitem__ Условие: В классе Playlist добавьте метод__getitem__, чтобы можно было получать песню по индексу (playlist[0]
возвращает первую песню).
Пример вывода: playlist[0] → "Bohemian Rhapsody"
15. Задачи
Продвинутая задача: __call__ Условие: Создайте класс Counter,
который подсчитывает, сколько раз его вызывали. Реализуйте метод
__call__, чтобы при вызове экземпляра (counter()) возвращалось
текущее количество вызовов.
counter = Counter()
counter() # Вывод: 1
counter() # Вывод: 2
16. Задачи
Условие: Реализуйте класс Logger как Синглтон с помощью __new__.
Добавьте метод log(message), который сохраняет сообщения в
список logs. Убедитесь, что все экземпляры Logger используют один
и тот же список.
logger1 = Logger()
logger2 = Logger()
logger1.log("Сообщение 1")
print(logger2.logs) # Вывод: ["Сообщение 1"]
17. Задачи
Конфигурация: Синглтон для настроек Условие: Создайте классConfig как Синглтон, который хранит настройки приложения (например,
словарь settings). Реализуйте метод set_setting(key, value) для
добавления настроек. Проверьте, что все экземпляры используют один
словарь.
config1 = Config()
config2 = Config()
config1.set_setting("theme", "dark")
print(config2.settings) # Вывод: {"theme": "dark"}
programming