from abc import ABC, abstractmethod # Интерфейс для элементов, которые могут быть посещены class Element(ABC): @abstractmethod def accept(self, visitor): pass # Конкретные элементы class Book(Element): def __init__(self, title, author): self.title = title self.author = author def accept(self, visitor): visitor.visit_book(self) class Movie(Element): def __init__(self, title, director): self.title = title self.director = director def accept(self, visitor): visitor.visit_movie(self) # Интерфейс для посетителей class Visitor(ABC): @abstractmethod def visit_book(self, book): pass @abstractmethod def visit_movie(self, movie): pass # Конкретный посетитель class ConcreteVisitor(Visitor): def visit_book(self, book): print(f"Книга: {book.title}, Автор: {book.author}") def visit_movie(self, movie): print(f"Фильм: {movie.title}, Режиссер: {movie.director}") # Создаем элементы book1, book2, movie1 = Book("1984", "Джордж Оруэлл"), Book("Мастер и Маргарита", "Михаил Булгаков"), \ Movie("Начало", "Кристофер Нолан") # Создаем посетителя print_visitor = ConcreteVisitor() # Посещаем элементы for element in [book1, book2, movie1]: element.accept(print_visitor)