uz
Feedback
Python | Вопросы собесов

Python | Вопросы собесов

Kanalga Telegram’da o‘tish

📈 Telegram kanali Python | Вопросы собесов analitikasi

Python | Вопросы собесов (@python_easy_ru) Rus til segmentidagi kanali faol ishtirokchi. Hozirda hamjamiyat 13 101 obunachidan iborat bo'lib, Texnologiyalar & Aralashmalar toifasida 9 734-o'rinni va Rossiya mintaqasida 50 704-o'rinni egallagan.

📊 Auditoriya ko‘rsatkichlari va dinamika

невідомо sanasidan buyon loyiha tez o‘sib, 13 101 obunachiga ega bo‘ldi.

10 Iyun, 2026 dagi oxirgi ma’lumotlarga ko‘ra kanal barqaror faollikka ega. Oxirgi 30 kunda obunachilar soni -55 ga, so‘nggi 24 soatda esa 1 ga o‘zgardi va umumiy qamrov yuqori darajada qolmoqda.

  • Tasdiqlash holati: Tasdiqlanmagan
  • Jalb etish (ER): Auditoriya o‘rtacha 8.86% darajada jalb etiladi. Nashrdan keyingi dastlabki 24 soatda kontent odatda umumiy obunachilar sonining 5.51% ini tashkil etuvchi reaksiyalarni to‘playdi.
  • Post qamrovi: Har bir post o‘rtacha 1 161 marta ko‘riladi; birinchi sutkada odatda 722 ta ko‘rish yig‘iladi.
  • Reaksiyalar va o‘zaro ta’sir: Auditoriya faol: har bir postga o‘rtacha 3 ta reaksiya keladi.
  • Tematik yo‘nalishlar: Kontent ставь, модуль, строка, docker, alice kabi asosiy mavzularga jamlangan.

📝 Tavsif va kontent siyosati

Muallif resursni shaxsiy fikrni ifoda etish maydoni sifatida ta’riflaydi:
Cайт: easyoffer.ru Реклама: @easyoffer_adv ВП: @easyoffer_vp Тесты t.me/+20tRfhrwPpM4NDQy Задачи t.me/+nsl4meWmhfQwNDVi Вакансии t.me/+cXGKkrOY2-w3ZTky

Yuqori yangilanish chastotasi (oxirgi ma’lumot 11 Iyun, 2026 da olingan) sababli kanal doimo dolzarb va katta qamrovli bo‘lib qoladi. Analitika auditoriya kontent bilan faol hamkorlik qilishini, uni Texnologiyalar & Aralashmalar toifasidagi muhim ta’sir nuqtasiga aylantirishini ko‘rsatadi.

13 101
Obunachilar
+124 soatlar
-147 kunlar
-5530 kunlar
Postlar arxiv
📌 Что такое Наблюдатель (Observer) ? 💬 Спрашивают в 3% собеседований Паттерн "Наблюдатель" (Observer) — это поведенческий паттерн проектирования, который определяет зависимость "один ко многим" между объектами. Когда состояние одного объекта изменяется, все его зависимые объекты автоматически оповещаются и обновляются. Этот паттерн позволяет объектам подписываться на события, происходящие в другом объекте. 🤔 Зачем нужен данный паттерн? 1️⃣ Обновление состояния: Автоматически оповещает зависимые объекты о изменениях в объекте-наблюдаемом. 2️⃣ Разделение обязанностей: Позволяет разделить логику оповещения и обновления состояния между объектами. 3️⃣ Гибкость и расширяемость: Упрощает добавление новых наблюдателей и изменение их поведения без изменения кода объекта-наблюдаемого. 🤔 Как работает данный паттерн? Паттерн включает следующие компоненты: ➕ Субъект (Subject): Интерфейс или абстрактный класс, определяющий методы для добавления, удаления и оповещения наблюдателей. ➕ Конкретный субъект (ConcreteSubject): Реализация субъекта, хранящая состояние и оповещающая наблюдателей об изменениях. ➕ Наблюдатель (Observer): Интерфейс или абстрактный класс, определяющий метод для обновления состояния в ответ на оповещения. ➕ Конкретный наблюдатель (ConcreteObserver): Реализация наблюдателя, обновляющая своё состояние в ответ на изменения субъекта.
from abc import ABC, abstractmethod

# Интерфейс наблюдателя
class Observer(ABC):
    @abstractmethod
    def update(self, temperature):
        pass

# Конкретный наблюдатель
class TemperatureDisplay(Observer):
    def update(self, temperature):
        print(f"Temperature Display: Temperature updated to {temperature}°C")

class TemperatureAlert(Observer):
    def update(self, temperature):
        if temperature > 30:
            print("Temperature Alert: Temperature is too high!")

# Субъект
class WeatherStation:
    def __init__(self):
        self._observers = []
        self._temperature = None

    def add_observer(self, observer):
        self._observers.append(observer)

    def remove_observer(self, observer):
        self._observers.remove(observer)

    def set_temperature(self, temperature):
        self._temperature = temperature
        self.notify_observers()

    def notify_observers(self):
        for observer in self._observers:
            observer.update(self._temperature)

# Клиентский код
weather_station = WeatherStation()
display = TemperatureDisplay()
alert = TemperatureAlert()

weather_station.add_observer(display)
weather_station.add_observer(alert)

weather_station.set_temperature(25)  # Temperature Display: Temperature updated to 25°C
weather_station.set_temperature(35)  # Temperature Display: Temperature updated to 35°C
                                     # Temperature Alert: Temperature is too high!
🤔 Преимущества: 1️⃣ Автоматическое оповещение: Автоматически обновляет наблюдателей при изменении состояния субъекта. 2️⃣ Разделение обязанностей: Субъект не знает о конкретных наблюдателях и их логике. 3️⃣ Гибкость и расширяемость: Легко добавлять новых наблюдателей и изменять их поведение. 🤔 Недостатки: 1️⃣ Порядок уведомления: Порядок оповещения наблюдателей может быть важен и требует управления. 2️⃣ Потенциальные утечки памяти: Неудаленные наблюдатели могут привести к утечкам памяти. 🤔 Когда использовать данный паттерн? ➕ Когда изменение состояния одного объекта должно приводить к изменению других объектов. ➕ Когда необходимо централизованное оповещение об изменениях состояния. ➕ Когда нужно минимизировать связи между субъектом и наблюдателями. Паттерн "Наблюдатель" является мощным инструментом для управления зависимостями и оповещением в системе, упрощая взаимодействие между объектами и улучшая модульность кода. 🔥 ТОП ВОПРОСОВ С СОБЕСОВ 🔒 База собесов | 🔒 База тестовых

🤔 Что такое итератор в Python?
Anonymous voting

👨‍💻 Джун: Слушай, вот стажировку я прошел, где теперь можно чекнуть вакансии на работу? 🍷 Мидл: Ооо, тебе помогут ребята с
👨‍💻 Джун: Слушай, вот стажировку я прошел, где теперь можно чекнуть вакансии на работу? 🍷 Мидл: Ооо, тебе помогут ребята с канала Джун работает 💯 Карьеру нужно начинать с хорошими работодателями. Твое резюме будет ликовать, ведь контент выходит каждый день, работа ждет тебя, мой друг! 😏 Не упускай возможность и подписывайся, чтобы не потерять

Запустите рекламу в телеграм-каналах с Яндекс Директом Перфоманс-реклама теперь в телеграм-каналах ⚡ Яндекс Директ знает, как
Запустите рекламу в телеграм-каналах с Яндекс Директом Перфоманс-реклама теперь в телеграм-каналах ⚡ Яндекс Директ знает, как привлечь целевую аудиторию 💰👌 Попробовать #реклама yandex.ru О рекламодателе

📌 Что такое хранитель (Memento) ? 💬 Спрашивают в 3% собеседований Паттерн "Хранитель" (Memento) — это поведенческий паттерн проектирования, который позволяет сохранять и восстанавливать состояние объекта, не раскрывая его внутреннюю структуру. Это полезно для реализации функций отмены операций, восстановления предыдущих состояний и создания контрольных точек. 🤔 Зачем нужен данный паттерн? 1️⃣ Отмена и повтор операций: Позволяет легко отменять изменения и возвращаться к предыдущим состояниям. 2️⃣ Сохранение состояния: Позволяет сохранять состояния объектов в определённые моменты времени. 3️⃣ Инкапсуляция состояния: Хранит внутреннее состояние объекта, не нарушая его инкапсуляции. 🤔 Как работает данный паттерн? Паттерн включает следующие компоненты: ➕ Хранитель (Memento): Объект, который сохраняет состояние другого объекта. ➕ Создатель (Originator): Объект, чьё состояние сохраняется и восстанавливается. ➕ Опекун (Caretaker): Объект, который отвечает за хранение хранителей и, при необходимости, предоставляет их создателю для восстановления состояния.
# Хранитель
class Memento:
    def __init__(self, state):
        self._state = state

    def get_state(self):
        return self._state

# Создатель
class TextEditor:
    def __init__(self):
        self._state = ""

    def type(self, text):
        self._state += text

    def save(self):
        return Memento(self._state)

    def restore(self, memento):
        self._state = memento.get_state()

    def get_state(self):
        return self._state

# Опекун
class History:
    def __init__(self):
        self._mementos = []

    def save(self, memento):
        self._mementos.append(memento)

    def undo(self):
        if not self._mementos:
            return None
        return self._mementos.pop()

# Клиентский код
editor = TextEditor()
history = History()

# Пользователь вводит текст
editor.type("Hello, ")
editor.type("world!")
print(editor.get_state())  # Hello, world!

# Сохранение состояния
history.save(editor.save())

# Продолжение ввода текста
editor.type(" How are you?")
print(editor.get_state())  # Hello, world! How are you?

# Восстановление состояния
editor.restore(history.undo())
print(editor.get_state())  # Hello, world!
🤔 Преимущества: 1️⃣ Отмена и восстановление: Легко реализовать функции отмены и восстановления. 2️⃣ Инкапсуляция состояния: Состояние сохраняется и восстанавливается без нарушения инкапсуляции. 3️⃣ Упрощение управления состоянием: Позволяет создавать контрольные точки состояния объекта. 🤔 Недостатки: 1️⃣ Увеличение использования памяти: Сохранение состояния может потребовать значительных ресурсов, особенно для больших объектов. 2️⃣ Сложность управления: В сложных системах может быть трудно управлять множеством состояний и хранителей. 🤔 Когда использовать данный паттерн? ➕ Когда необходимо реализовать функции отмены и восстановления. ➕ Когда нужно сохранять состояние объекта в определённые моменты времени. ➕ Когда важно сохранять состояние объекта, не нарушая его инкапсуляции. Паттерн "Хранитель" является мощным инструментом для управления состоянием объектов, предоставляя возможность сохранять и восстанавливать состояния без раскрытия внутренней структуры объекта. 🔥 ТОП ВОПРОСОВ С СОБЕСОВ 🔒 База собесов | 🔒 База тестовых

📕 Прогер, как ты расширяешь свой кругозор в сфере IT? Не достаточно знать что-то одно, мысля глобально и изучая смежные отра
📕 Прогер, как ты расширяешь свой кругозор в сфере IT? Не достаточно знать что-то одно, мысля глобально и изучая смежные отрасли, ты не только становишься умнее, но и увеличиваешь свою востребованность и свой заработок. 🗿 Не обязательно читать заумные книги и смотреть подкасты - это долго. У нас есть решение: 🔥 Полезные статьи - концентрат знаний. 🔥 Советы - короткие сообщения, которые будут увеличивать твою эффективность. 🔥 Инструменты - tool-сайты в разы упростят и ускорят твою работу. 🧑‍💻 Время, силы, желание - ресурсы, которые нужно использовать с умом. Подпишись на канал Заметки прогера, IT ниша скажет "спасибо" за такого специалиста.

Стажировки и хакатоны для начинающих айтишников Где айтишнику найти стажировку, которая не требует опыта работы? Как узнать,
Стажировки и хакатоны для начинающих айтишников Где айтишнику найти стажировку, которая не требует опыта работы? Как узнать, в каких компаниях не потратишь время зря и научишься чему-то полезному? Подписаться на канал с IT-стажировками, где отбирают самые толковые предложения и делятся: — стажировками для айтишников с минимальным опытом работы или без него; — анонсами хакатонов, которые будут выгодно смотреться в резюме; — карьерными и образовательными ивентами для прокачки hard и soft skills. Подписаться #реклама О рекламодателе

🤔 Что такое MRO?
Anonymous voting

😭 Джун: Как мне найти работу в IT, если опыта нет? 🧑‍💻 Мидл: Просто зайди на канал Джун стажер и подбери стажировку по душ
😭 Джун: Как мне найти работу в IT, если опыта нет? 🧑‍💻 Мидл: Просто зайди на канал Джун стажер и подбери стажировку по душе. 📕 Админы отбирают самые сочные вакансии от ведущих компаний, к тому же контент выходит каждый день. 🔥 Не упускай возможность и подписывайся, чтобы не потерять

Как повысить эффективность вебинаров? Организация продающего вебинара - не простая задача, ведь необходимо предусмотреть множ
Как повысить эффективность вебинаров? Организация продающего вебинара - не простая задача, ведь необходимо предусмотреть множество деталей: удобную дату, вовлекающий контент, методы продвижения и взаимодействия с участниками. Вебинары от МТС Линк помогают привлекать новых клиентов и увеличивать конверсию из участника в лид. В сервисе доступен анализ поведения пользователей во время вебинара, синхронный перевод, автовебинары и интерактивные инструменты для вовлечения участников. Делимся методичкой с кейсами, чек-листами и инструкциями для маркетологов, PR и event-менеджеров, чтобы сделать вебинары эффективным инструментом для лидогенерации. Получите методичку бесплатно на сайте. Скачать #реклама 16+ mts-link.ru О рекламодателе

📌 Что такое паттерн Посредник (Mediator) ? 💬 Спрашивают в 3% собеседований Паттерн "Посредник" (Mediator) — это поведенческий паттерн проектирования, который позволяет уменьшить зависимости между объектами, упрощая их взаимодействие. Посредник инкапсулирует способ взаимодействия множества объектов, предотвращая их прямые ссылки друг на друга, что уменьшает связность системы и улучшает её модульность. 🤔 Зачем нужен данный паттерн? 1️⃣ Уменьшение связности: Обеспечивает слабую связанность между взаимодействующими объектами, что упрощает изменение и повторное использование классов. 2️⃣ Упрощение взаимодействий: Объекты взаимодействуют через посредника, что упрощает управление их взаимодействиями. 3️⃣ Централизованный контроль: Все взаимодействия проходят через посредника, что облегчает отладку и тестирование системы. 🤔 Как работает данный паттерн? Паттерн включает следующие компоненты: ➕ Посредник (Mediator): Интерфейс, определяющий методы для взаимодействия с коллегами. ➕ Конкретный посредник (ConcreteMediator): Реализует методы взаимодействия, определённые в интерфейсе посредника. ➕ Коллеги (Colleague): Классы, которые обмениваются информацией через посредника. Каждый коллега знает о посреднике, но не знает о других коллегах.
from abc import ABC, abstractmethod

# Посредник
class Mediator(ABC):
    @abstractmethod
    def notify(self, sender, event):
        pass

# Конкретный посредник
class ConcreteMediator(Mediator):
    def __init__(self):
        self.button = None
        self.textbox = None

    def set_button(self, button):
        self.button = button

    def set_textbox(self, textbox):
        self.textbox = textbox

    def notify(self, sender, event):
        if event == "button_clicked":
            self.textbox.enable()
        elif event == "textbox_filled":
            self.button.enable()

# Коллеги
class Button:
    def __init__(self, mediator):
        self.mediator = mediator
        self.enabled = False

    def click(self):
        print("Button clicked.")
        self.mediator.notify(self, "button_clicked")

    def enable(self):
        self.enabled = True
        print("Button enabled.")

class TextBox:
    def __init__(self, mediator):
        self.mediator = mediator
        self.enabled = False

    def fill(self):
        print("TextBox filled.")
        self.mediator.notify(self, "textbox_filled")

    def enable(self):
        self.enabled = True
        print("TextBox enabled.")

# Клиентский код
mediator = ConcreteMediator()
button = Button(mediator)
textbox = TextBox(mediator)

mediator.set_button(button)
mediator.set_textbox(textbox)

button.click()  # Button clicked. TextBox enabled.
textbox.fill()  # TextBox filled. Button enabled.
🤔 Преимущества: 1️⃣ Уменьшение связности: Упрощает изменение и повторное использование объектов, уменьшает количество прямых зависимостей между ними. 2️⃣ Упрощение взаимодействий: Все взаимодействия централизованы, что упрощает управление ими. 3️⃣ Централизованный контроль: Облегчает отладку и тестирование, так как все взаимодействия проходят через один объект. 🤔 Недостатки: 1️⃣ Централизация логики: Посредник может стать слишком сложным и трудным для поддержки, если будет обрабатывать слишком много логики. 2️⃣ Ограниченная масштабируемость: Централизация может стать узким местом, особенно в крупных системах с множеством взаимодействий. 🤔 Когда использовать данный паттерн? ➕ Когда нужно уменьшить связность между множеством взаимодействующих объектов. ➕ Когда нужно централизовать сложные взаимодействия между объектами. ➕ Когда изменения в одном объекте должны привести к изменениям в других, без необходимости явно связывать их. Паттерн "Посредник" является мощным инструментом для управления взаимодействиями в системе, улучшая её модульность и уменьшая сложность. 🔥 ТОП ВОПРОСОВ С СОБЕСОВ 🔒 База собесов | 🔒 База тестовых

👨‍💻 Будущий специалист, ты знаешь, какая самая частая ошибка новичка в сфере IT? Отсутствие практики убивает в тебе потенциал ✈️ Как с этим бороться, мой друг? Найди работу и прокачивай свои скилы на конкретных задачах 🔥 У нас ты будешь находить большое количество вакансий каждый день. Понятие работы перестанет быть для тебя размытым. Подпишись на канал и не откладывай свой прогресс в долгий ящик.

Реклама для бизнеса любого уровня в Яндекс Директе Создайте эффективную рекламную кампанию с алгоритмами Яндекс Директа 👌 Начните прямо сейчас ⚡ Зарегистрироваться #реклама direct.yandex.ru О рекламодателе

🤔 Как в Python определить функцию, которая принимает переменное количество аргументов?
Anonymous voting

🧑‍💻 Если твой английский позволяет ответить только на вопрос "Do you speak English", то с этим нужно что-то делать, будучи программистом. 🫤 Ты в курсе, что ... - говорят по-английски — 20% из всех людей. - Большое кол-во IT документации написано на английском. Хочешь понимать код лучше? Изучи язык, который используется в его основе. 📕 На нашем канале ты постепенно будешь набираться опыта, в этом тебе помогут: - Тесты для изучения английского: проверьте свои знания на практике. - Английский через мемы: учите язык весело и с интересом. - Шпаргалки для повторения: закрепите знания быстро и эффективно. - Английский сленг программиста: станьте настоящим профи в коммуникации. 🔥 Маленький шаг в изучении иностранного откроет перед тобой большие возможности будущего специалиста и значительно повысит твое зп. 🌸 Подпишись, do it!

Хотите переехать в Германию? А вы знали, что для получения ВНЖ в Германию не требуется высшее образование, если вы IT-специалист? Да, начиная с 18 ноября, для айтишников отменены требования к высшему образованию. Но важно доказать ваш профессионализм! ✅ Необходим минимум 3-х летний опыт работы в течение последних 7 лет. Вы соответствуете условиям и ищете новые проекты в Европе? 📱 Обратитесь к экспертам Intermigro для получения бесплатной консультации и помощи в оформлении необходимых документов. Перейти на сайт #реклама intermigro.com О рекламодателе

📌 Что такое паттерн Интерпретатор (Interpreter) ? 💬 Спрашивают в 3% собеседований Паттерн "Интерпретатор" (Interpreter) — это поведенческий паттерн проектирования, который предоставляет способ определить грамматику для определенного языка и интерпретировать предложения на этом языке. Паттерн используется для анализа и выполнения структурированных текстов, таких как математические выражения, команды или сценарии. 🤔 Зачем нужен данный паттерн? 1️⃣ Анализ и выполнение текстов: Позволяет анализировать и выполнять предложения на специальном языке. 2️⃣ Упрощение грамматики: Разделяет грамматику языка и её интерпретацию, что упрощает понимание и изменение правил языка. 3️⃣ Расширяемость: Легко добавлять новые правила и расширять язык. 🤔 Как работает данный паттерн? Паттерн включает следующие компоненты: ➕ Контекст (Context): Содержит информацию, глобальную для всех интерпретаторов. ➕ Абстрактное выражение (AbstractExpression): Интерфейс или абстрактный класс для всех выражений. ➕ Конкретные выражения (TerminalExpression и NonTerminalExpression): Классы, реализующие конкретные правила грамматики. ➕ Клиент (Client): Построит и использует объектную структуру абстрактного синтаксического дерева.
from abc import ABC, abstractmethod

# Контекст (необязательный компонент)
class Context:
    pass

# Абстрактное выражение
class Expression(ABC):
    @abstractmethod
    def interpret(self, context):
        pass

# Терминальное выражение (число)
class Number(Expression):
    def __init__(self, value):
        self.value = value

    def interpret(self, context):
        return self.value

# Нетерминальное выражение (сложение)
class Add(Expression):
    def __init__(self, left, right):
        self.left = left
        self.right = right

    def interpret(self, context):
        return self.left.interpret(context) + self.right.interpret(context)

# Нетерминальное выражение (вычитание)
class Subtract(Expression):
    def __init__(self, left, right):
        self.left = left
        self.right = right

    def interpret(self, context):
        return self.left.interpret(context) - self.right.interpret(context)

# Клиентский код
def main():
    # Построение выражения: 1 + 2 - 3
    expression = Subtract(Add(Number(1), Number(2)), Number(3))
    context = Context()  # Контекст может использоваться для передачи информации
    result = expression.interpret(context)
    print(result)  # 0

if __name__ == "__main__":
    main()
🤔 Преимущества: 1️⃣ Простота добавления новых правил: Легко добавлять новые грамматические правила и расширять язык. 2️⃣ Четкая структура: Грамматика и интерпретация языка разделены, что упрощает понимание и изменение. 🤔 Недостатки: 1️⃣ Ограниченная производительность: Может быть неэффективным для сложных или очень больших грамматик. 2️⃣ Сложность поддержки: Поддержка сложных грамматик может стать трудной из-за большого числа классов. 🤔 Когда использовать данный паттерн? ➕ Когда есть необходимость интерпретировать и выполнять предложения на определенном языке. ➕ Когда грамматика языка относительно проста и стабильна. ➕ Когда нужно часто добавлять новые грамматические правила. Паттерн "Интерпретатор" является мощным инструментом для определения и интерпретации грамматик, позволяя легко анализировать и выполнять структурированные тексты. 🔥 ТОП ВОПРОСОВ С СОБЕСОВ 🔒 База собесов | 🔒 База тестовых

Приводите соискателей на hh.ru и зарабатывайте на cpa.hh Вебмастер, или привлекаете трафик в интернете? Подключайтесь к партн
Приводите соискателей на hh.ru и зарабатывайте на cpa.hh Вебмастер, или привлекаете трафик в интернете? Подключайтесь к партнерской программе CPA.HH.RU и приводите соискателей по модели CPA в HR вертикали: - Прямые офферы от работодателей на cpa.hh.ru; - Короткий холд (от 7 дней); - Автоматическая обратная связь по лидам. Узнать больше #реклама hh.ru О рекламодателе

🤔 Какой метод используется для чтения всего содержимого файла в Python?
Anonymous voting

📌 Что такое паттерн Команда (Command) ? 💬 Спрашивают в 3% собеседований Паттерн "Команда" (Command) — это поведенческий паттерн проектирования, который превращает запросы в объекты, позволяя передавать их как аргументы при вызове методов, ставить запросы в очередь, логировать их и поддерживать отмену операций. 🤔 Зачем нужен данный паттерн? 1️⃣ Инкапсуляция запросов: Позволяет инкапсулировать запросы в виде объектов. 2️⃣ Разделение ответственности: Отделяет отправителя запроса от объекта, выполняющего запрос. 3️⃣ Логирование и отмена: Упрощает реализацию логирования, очереди запросов и отмены операций. 4️⃣ Параметризация объектов: Позволяет параметризовать объекты с операциями. 🤔 Как работает данный паттерн? Паттерн включает следующие компоненты: ➕ Команда (Command): Интерфейс с методом execute. ➕ Конкретные команды (ConcreteCommand): Реализуют интерфейс команды, инкапсулируя действия для конкретного запроса. ➕ Получатель (Receiver): Объект, который выполняет действие по запросу. ➕ Отправитель (Invoker): Объект, который инициирует выполнение команды. ➕ Клиент (Client): Создаёт объекты команд и связывает их с получателями.
from abc import ABC, abstractmethod

# Интерфейс команды
class Command(ABC):
    @abstractmethod
    def execute(self):
        pass

# Получатель
class Light:
    def on(self):
        print("Light is ON")

    def off(self):
        print("Light is OFF")

# Конкретная команда включения света
class LightOnCommand(Command):
    def __init__(self, light):
        self._light = light

    def execute(self):
        self._light.on()

# Конкретная команда выключения света
class LightOffCommand(Command):
    def __init__(self, light):
        self._light = light

    def execute(self):
        self._light.off()

# Отправитель
class RemoteControl:
    def __init__(self):
        self._commands = {}

    def set_command(self, button, command):
        self._commands[button] = command

    def press_button(self, button):
        if button in self._commands:
            self._commands[button].execute()
        else:
            print("No command assigned to this button")

# Клиентский код
light = Light()
light_on = LightOnCommand(light)
light_off = LightOffCommand(light)

remote = RemoteControl()
remote.set_command("ON", light_on)
remote.set_command("OFF", light_off)

remote.press_button("ON")  # Light is ON
remote.press_button("OFF") # Light is OFF
remote.press_button("UNASSIGNED") # No command assigned to this button
🤔 Преимущества: 1️⃣ Инкапсуляция запросов: Позволяет инкапсулировать действия в объекты команд. 2️⃣ Поддержка отмены и логирования: Упрощает реализацию отмены операций и логирования. 3️⃣ Гибкость и расширяемость: Легко добавлять новые команды без изменения существующего кода. 4️⃣ Разделение ответственности: Разделяет ответственность между отправителем и получателем. 🤔 Недостатки: 1️⃣ Усложнение кода: Добавление множества классов команд может усложнить код. 2️⃣ Требует дополнительных ресурсов: Создание объектов команд может потребовать дополнительных ресурсов. 🤔 Когда использовать данный паттерн? ➕ Когда нужно параметризовать объекты выполняемыми действиями. ➕ Когда требуется логирование, отмена и повтор запросов. ➕ Когда нужно передавать операции в очереди или как аргументы при вызове методов. ➕ Когда нужно разделить ответственность между отправителем запроса и объектом, выполняющим запрос. Паттерн "Команда" является мощным инструментом для управления действиями и их инкапсуляции, обеспечивая гибкость и расширяемость системы. 🔥 ТОП ВОПРОСОВ С СОБЕСОВ 🔒 База собесов | 🔒 База тестовых