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

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

Открыть в Telegram

📈 Аналитический обзор Telegram-канала Python | Вопросы собесов

Канал Python | Вопросы собесов (@python_easy_ru) языкового сегмента Русский является активным участником. Сейчас сообщество объединяет 13 106 подписчиков, занимая 9 745 место в категории Технологии и приложения и 50 714 место в регионе Россия.

📊 Показатели аудитории и динамика

С момента создания невідомо проект демонстрирует стремительный рост, собрав аудиторию из 13 106 подписчиков.

Согласно последним данным от 09 июня, 2026, канал показывает стабильную активность. За последние 30 дней изменение числа участников составило -53, а за последние 24 часа — -3, при этом общий охват остаётся высоким.

  • Статус верификации: Не верифицирован
  • Уровень вовлечённости (ER): Средний показатель вовлечённости аудитории составляет 8.62%. В первые 24 часа после публикации контент обычно набирает 5.62% реакций от общего числа подписчиков.
  • Охват публикаций: В среднем каждый пост получает 1 129 просмотров. В течение первых суток публикация набирает 737 просмотров.
  • Реакции и взаимодействия: Аудитория активно поддерживает контент: среднее количество реакций на один пост — 4.
  • Тематические интересы: Контент сосредоточен на ключевых темах, таких как ставь, модуль, строка, docker, alice.

📝 Описание и контентная политика

Автор описывает ресурс как площадку для выражения субъективного мнения:
Cайт: easyoffer.ru Реклама: @easyoffer_adv ВП: @easyoffer_vp Тесты t.me/+20tRfhrwPpM4NDQy Задачи t.me/+nsl4meWmhfQwNDVi Вакансии t.me/+cXGKkrOY2-w3ZTky

Благодаря высокой частоте обновлений (последние данные получены 10 июня, 2026) канал поддерживает актуальность и высокий уровень охвата публикаций. Аналитика показывает, что аудитория активно взаимодействует с контентом, что делает его важной точкой влияния в категории Технологии и приложения.

13 106
Подписчики
-324 часа
-137 дней
-5330 день
Архив постов
⚡️ Вся база знаний по IT в одном месте! 🧑‍💻 IT База — краткие разборы самого важного из мира IT. Сотни мастхев-ресурсов, каждый день новые материалы по работе и подготовке к собеседованиям. Подойдёт как новичкам, так и состоявшимся айтишникам; 🖥 Frontend База — всё для фронтенд разработчиков. Готовые решения для проектов, полезные курсы по JS/HTML/CSS, готовые роадмапы для комфортного освоения в профессии и дальнейшего развития; 👣 Backend База — самое важное для бэкендеров. Всё о работе с PHP, MySQL, MongoDB, Golang и Rust в одном месте, плюс полные курсы и лайфхаки для работы на каждый день; 🖥 База Знаний — склад полезных курсов и материалов, где легко найти что-то нужное по хэштегам. Если вам что-то интересно про IT, то оно уже лежит на Базе, проверяйте. Успей подписаться, чтобы не потерять!

🤔 Чем init() отличается от new()? Метод `__init__()` отвечает за инициализацию объекта после его создания и не создает сам объект, а лишь настраивает его начальные параметры. Метод `__new__()` отвечает за создание нового экземпляра класса и вызывается перед `__init__()`. `__new__()` используется, когда требуется контролировать процесс создания объектов, например, при наследовании или работе с неизменяемыми типами. В большинстве случаев программисту достаточно использовать только `__init__()`. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Курс графического дизайна с нуля. Бесплатное обучение! Выбери свое направление в дизайне: графический дизайн, веб-дизайн, UX/UI-дизайн. И изучи бесплатно основы дизайна с личным наставником! 3 работы в портфолио. Узнать больше #реклама 16+ yudaevschool24.online О рекламодателе

🤔 Что такое паттерн Состояние (State)? Это поведенческий паттерн проектирования, который позволяет объекту изменять свое поведение в зависимости от его состояния. Это делается путем инкапсуляции состояний в отдельные классы и делегирования задач состояниям, таким образом объект изменяет свой класс поведения при изменении состояния. 🚩Зачем нужен 🟠Управление сложными переходами 🟠Инкапсуляция логики состояния Логика, связанная с конкретными состояниями, инкапсулируется в отдельных классах, что способствует лучшему разделению обязанностей и поддержке кода. 🟠Гибкость и расширяемость Легко добавлять новые состояния и изменять существующие без внесения изменений в основной код объекта.
from abc import ABC, abstractmethod

# Интерфейс состояния
class State(ABC):
    @abstractmethod
    def insert_coin(self):
        pass
    
    @abstractmethod
    def eject_coin(self):
        pass
    
    @abstractmethod
    def dispense(self):
        pass

# Конкретные состояния
class NoCoinState(State):
    def __init__(self, machine):
        self.machine = machine

    def insert_coin(self):
        print("Coin inserted.")
        self.machine.set_state(self.machine.has_coin_state)
    
    def eject_coin(self):
        print("No coin to eject.")
    
    def dispense(self):
        print("Insert coin first.")

class HasCoinState(State):
    def __init__(self, machine):
        self.machine = machine
    
    def insert_coin(self):
        print("Coin already inserted.")
    
    def eject_coin(self):
        print("Coin ejected.")
        self.machine.set_state(self.machine.no_coin_state)
    
    def dispense(self):
        print("Dispensing product.")
        self.machine.set_state(self.machine.no_coin_state)

# Контекст
class VendingMachine:
    def __init__(self):
        self.no_coin_state = NoCoinState(self)
        self.has_coin_state = HasCoinState(self)
        self.state = self.no_coin_state
    
    def set_state(self, state: State):
        self.state = state
    
    def insert_coin(self):
        self.state.insert_coin()
    
    def eject_coin(self):
        self.state.eject_coin()
    
    def dispense(self):
        self.state.dispense()

# Клиентский код
def main():
    machine = VendingMachine()
    
    machine.insert_coin()  # Coin inserted.
    machine.dispense()     # Dispensing product.
    machine.eject_coin()   # No coin to eject.
    
    machine.insert_coin()  # Coin inserted.
    machine.eject_coin()   # Coin ejected.
    machine.dispense()     # Insert coin first.

if __name__ == "__main__":
    main()
🚩Как это работает 🟠Интерфейс `State` Определяет методы, которые должны реализовать все конкретные состояния. 🟠Конкретные состояния (`NoCoinState`, `HasCoinState`) Реализуют интерфейс State и определяют поведение для каждого состояния. 🟠Класс `VendingMachine` Содержит ссылки на все возможные состояния и метод для изменения текущего состояния. Делегирует вызовы методов текущему состоянию. 🟠Методы `insert_coin`, `eject_coin`, `dispense` Вызываются клиентом и делегируются текущему состоянию. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое генератор? Генератор — это функция, которая возвращает итератор и использует ключевое слово `yield` для ленивого вычисления значений. Генераторы позволяют возвращать элементы по одному, сохраняя состояние функции между вызовами, что делает их идеальными для работы с большими наборами данных или потоками. В отличие от обычной функции, генератор не возвращает все значения сразу, а генерирует их по мере необходимости. Это помогает экономить память и ресурсы. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Помощь в трудоустройстве в IT-сфере! В России из-за дефицита айтишников запустили бесплатную программу по обучению IT-специал
+9
Помощь в трудоустройстве в IT-сфере! В России из-за дефицита айтишников запустили бесплатную программу по обучению IT-специалистов. Теперь любой желающий может попробовать себя в IT с полного нуля и начать обучение бесплатно! Узнайте про дальнейшее трудоустройство в ведущие IT-компании для восполнения кадрового дефицита. Для этого нужно: - Перейти по ссылке - Заполнить анкету и ответить на вопросы (занимает менее 3 минут) - На основании ваших ответов вы сразу узнаете, подходит ли вам сфера IT и сможете ли вы в ней работать Перейти на сайт #реклама 16+ urban-university.ru О рекламодателе

🤔 Что такое Наблюдатель (Observer)? Паттерн Наблюдатель (Observer) — это поведенческий паттерн проектирования, который определяет зависимость "один ко многим" между объектами, так что при изменении состояния одного объекта все зависящие от него объекты уведомляются и обновляются автоматически. Этот паттерн используется для реализации механизма подписки, когда объекты могут подписываться на события другого объекта и получать уведомления о любых изменениях. 🚩Зачем нужен? 🟠Разделение обязанностей: Позволяет отделить объект, который изменяет свое состояние, от объектов, которые реагируют на эти изменения. 🟠Поддержка реактивного программирования: Обеспечивает автоматическое уведомление и обновление зависимых объектов при изменении состояния наблюдаемого объекта. 🟠Гибкость и расширяемость: Легко добавлять или удалять наблюдателей без изменения кода наблюдаемого объекта. Пример реализации
from abc import ABC, abstractmethod

class Observer(ABC):
    @abstractmethod
    def update(self, message: str):
        pass

class ConcreteObserver(Observer):
    def __init__(self, name: str):
        self._name = name
    
    def update(self, message: str):
        print(f"{self._name} received message: {message}")

class Subject:
    def __init__(self):
        self._observers = []
    
    def add_observer(self, observer: Observer):
        self._observers.append(observer)
    
    def remove_observer(self, observer: Observer):
        self._observers.remove(observer)
    
    def notify_observers(self, message: str):
        for observer in self._observers:
            observer.update(message)

# Клиентский код для использования паттерна Наблюдатель
def main():
    subject = Subject()
    
    observer1 = ConcreteObserver("Observer 1")
    observer2 = ConcreteObserver("Observer 2")
    
    subject.add_observer(observer1)
    subject.add_observer(observer2)
    
    subject.notify_observers("Event 1")  # Observer 1 received message: Event 1
                                        # Observer 2 received message: Event 1
    
    subject.remove_observer(observer1)
    
    subject.notify_observers("Event 2")  # Observer 2 received message: Event 2

if __name__ == "__main__":
    main()
1⃣`Observer`: Объявляет метод update, который должны реализовать все конкретные наблюдатели. 2⃣`ConcreteObserver`: Реализует интерфейс Observer и определяет, как наблюдатель должен реагировать на обновления. 3⃣`Subject`: Содержит список наблюдателей и методы для добавления, удаления и уведомления наблюдателей. 4⃣`notify_observers`: Вызывается при изменении состояния субъекта и уведомляет всех зарегистрированных наблюдателей. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое декораторы? Декораторы в Python — это функции, которые принимают другую функцию или метод в качестве аргумента и изменяют или расширяют её поведение. Они позволяют легко добавлять функциональность без изменения исходного кода функции. Декораторы применяются с помощью символа `@` перед определением функции. Это мощный механизм для рефакторинга, добавления логгирования, проверки прав доступа и других задач. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Помощь в трудоустройстве в IT-сфере! В России из-за дефицита айтишников запустили бесплатную программу по обучению IT-специал
+9
Помощь в трудоустройстве в IT-сфере! В России из-за дефицита айтишников запустили бесплатную программу по обучению IT-специалистов. Теперь любой желающий может попробовать себя в IT с полного нуля и начать обучение бесплатно! Узнайте про дальнейшее трудоустройство в ведущие IT-компании для восполнения кадрового дефицита. Для этого нужно: - Перейти по ссылке - Заполнить анкету и ответить на вопросы (занимает менее 3 минут) - На основании ваших ответов вы сразу узнаете, подходит ли вам сфера IT и сможете ли вы в ней работать Перейти на сайт #реклама 16+ urban-university.ru О рекламодателе

🤔 Что такое хранитель (Memento)? Это поведенческий паттерн проектирования, который позволяет сохранять и восстанавливать предыдущее состояние объекта без нарушения инкапсуляции. Этот паттерн особенно полезен для реализации операций отмены и повтора, так как он позволяет хранить состояния объектов и возвращать их к этим состояниям по необходимости. 🚩Зачем нужен? 🟠Сохранение состояния: Позволяет сохранять текущее состояние объекта и восстанавливать его позже. 🟠Инкапсуляция: Обеспечивает сохранение состояния объекта без нарушения его инкапсуляции. Внутренние детали объекта остаются скрытыми от других объектов. 🟠Отмена и повтор операций: Поддерживает функциональность отмены и повтора операций, так как позволяет возвращать объект к предыдущим состояниям. Пример реализации
class Memento:
    def __init__(self, state: str):
        self._state = state

    def get_state(self) -> str:
        return self._state

class TextEditor:
    def __init__(self):
        self._state = ""
        self._history = []

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

    def _save_state(self):
        self._history.append(Memento(self._state))

    def undo(self):
        if not self._history:
            return
        memento = self._history.pop()
        self._state = memento.get_state()

    def get_content(self) -> str:
        return self._state

# Клиентский код для использования паттерна Хранитель
def main():
    editor = TextEditor()

    editor.type("Hello, ")
    editor.type("world!")
    print(editor.get_content())  # Hello, world!

    editor.undo()
    print(editor.get_content())  # Hello, 

    editor.undo()
    print(editor.get_content())  # 

if __name__ == "__main__":
    main()
1⃣`Memento`: Сохраняет состояние объекта. Он предоставляет методы для получения сохраненного состояния, но не предоставляет методов для изменения состояния, что обеспечивает неизменность. 2⃣`TextEditor`: Создает и использует объекты Memento для сохранения и восстановления своего состояния. Методы type и undo позволяют редактировать текст и отменять изменения. 3⃣`_save_state`: Сохраняет текущее состояние редактора в истории перед каждым изменением. 4⃣`undo`: Восстанавливает предыдущее состояние редактора из истории. Ставь 👍 и забирай 📚 Базу знаний

Python-разработчик в поиске работы? Тогда этот пост для вас 👍 Если вы хотите стать востребованным специалистом Middle-Middle
Python-разработчик в поиске работы? Тогда этот пост для вас 👍 Если вы хотите стать востребованным специалистом Middle-Middle+ уровня и получать от 200 тыс.₽, вам в IT Mentor 🐙 Это проект, где вы можете изучить Python без вложений с нуля или закрыть пробелы в хард- и софт-скиллах, чтобы найти более высокооплачиваемую работу. Именно трудоустройство — это фокус обучения в IT Mentor. Если не сможете устроиться на работу или пройти курс до конца — ничего не платите. В программе — только актуальный стек, который будет легко освоить с поддержкой опытных менторов Senior-уровня: ⭐️ основы Python, базы данных ⭐️ Django ⭐️ FastApi ⭐️ Git и опыт работы над реальным проектом в команде с фронтенд-разработчиками, QA, SA и BA под руководством тимлида Готовы приступить к обучению уже в этом ноябре? Оставляйте заявку по ссылке и изучайте подробнее программу курса https://clck.ru/3E2CHd Начните апгрейд своей карьеры с IT Mentor! Реклама. ИП Тюльников ИНН 526223159257.

🤔 Что такое SOLID? SOLID — это пять принципов объектно-ориентированного программирования, которые помогают проектировать гибкие, расширяемые и поддерживаемые системы. Они включают в себя: Single Responsibility (одна ответственность), Open/Closed (открытость для расширения, закрытость для изменений), Liskov Substitution (замена по Лисков), Interface Segregation (разделение интерфейсов) и Dependency Inversion (инверсия зависимостей). Эти принципы улучшают архитектуру программного обеспечения и делают код более надежным. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Обучаем Java-разработчиков оплата после выхода на работу В Kata Academy можно выучиться на Java-разработчика бесплатно, а зап
Обучаем Java-разработчиков оплата после выхода на работу В Kata Academy можно выучиться на Java-разработчика бесплатно, а заплатить уже после трудоустройства по специальности из фактической зарплаты. Если задуматься, то все в выигрыше: — ты получаешь работу в Москве или Санкт-Петербурге с хорошей зарплатой, мы получаем процент за инвестиции в тебя; — в наших интересах научить тебя так, чтобы твоя зарплата была как можно выше; — мы прокачиваем твои навыки еще 2 года после курса: проводим выездные мероприятия и мастер-классы — и доходы наших выпускников растут; — мы не зависим от банков и их рассрочек — кризис не повлиял на доступность курсов. Чтобы попасть на курс, нужно выполнить небольшое тестовое задание. Переходи по ссылке и оставляй заявку! Узнать больше #реклама 16+ kata.academy О рекламодателе

🤔 Что такое паттерн Фасад (Facade)? Паттерн Фасад (Facade) — это структурный паттерн проектирования, который предоставляет упрощённый интерфейс к сложной системе классов, библиотеке или фреймворку. Основная цель паттерна — уменьшить сложность взаимодействия с системой, скрывая её внутренние детали и предоставляя более простой интерфейс для клиента. 🚩Зачем нужен? Фасад помогает уменьшить сложность больших систем, делая их более понятными и удобными для использования. Он позволяет отделить клиентов системы от её сложных внутренних деталей, что облегчает поддержку и расширение системы. 🚩Как используется? Фасад создаётся как класс, который инкапсулирует взаимодействие с одной или несколькими подсистемами. Клиенты обращаются к этому фасаду, чтобы выполнять нужные действия, не вдаваясь в детали реализации этих действий.
# Подсистема 1
class CPU:
    def freeze(self):
        print("CPU freezing")

    def jump(self, position):
        print(f"CPU jumping to {position}")

    def execute(self):
        print("CPU executing")

# Подсистема 2
class Memory:
    def load(self, position, data):
        print(f"Memory loading {data} at {position}")

# Подсистема 3
class HardDrive:
    def read(self, lba, size):
        return f"Reading {size} bytes from LBA {lba}"

# Фасад
class ComputerFacade:
    def __init__(self):
        self.cpu = CPU()
        self.memory = Memory()
        self.hard_drive = HardDrive()

    def start(self):
        self.cpu.freeze()
        self.memory.load("0x00", self.hard_drive.read("100", "1024"))
        self.cpu.jump("0x00")
        self.cpu.execute()

# Клиентский код
computer = ComputerFacade()
computer.start()
🚩Плюсы Упрощение интерфейса: Снижает количество методов, с которыми нужно взаимодействовать клиенту. ➕Изоляция клиентов от подсистем: Клиенты не зависят от деталей реализации подсистем, что упрощает их модификацию и замену. ➕Снижение связности: Уменьшает зависимость между клиентами и сложными подсистемами. 🚩МинусыОграниченная функциональность: Может возникнуть ситуация, когда фасад не предоставляет весь необходимый функционал, требующийся клиенту. ➖Дополнительный слой абстракции: Создание фасада добавляет ещё один уровень абстракции, что может слегка усложнить систему. Ставь 👍 и забирай 📚 Базу знаний

🤔 В чем разница между итератором и генератором? Итератор — это объект, который поддерживает метод `__iter__()` и `__next__()` и позволяет проходить по коллекции элементов. Генератор — это специальный вид итератора, который создается с помощью ключевого слова `yield` и позволяет лениво возвращать элементы по одному, сохраняя состояние между вызовами. Генераторы обычно используются для обработки больших данных, поскольку они не требуют загрузки всего набора данных в память. Итераторы, в свою очередь, могут быть созданы вручную с помощью классов. Ставь 👍 если знал ответ, 🔥 если нет Забирай 📚 Базу знаний

Большая конференция Яндекс Рекламы на ВТБ Арене 22 октября приглашаем маркетологов и специалистов по рекламе обсудить новые т
Большая конференция Яндекс Рекламы на ВТБ Арене 22 октября приглашаем маркетологов и специалистов по рекламе обсудить новые технологии и рекламные тренды. Эксперты рынка выступят с докладами на актуальные темы и поделятся своим опытом. Участвовать можно офлайн и онлайн. Конференция бесплатная, нужно только зарегистрироваться. Зарегистрироваться #реклама 16+ ya.rekonfa.ru О рекламодателе

🤔 Что такое паттерн Компоновщик (Composite)? Паттерн Компоновщик (Composite) — это структурный паттерн проектирования, который позволяет сгруппировать объекты в древовидную структуру для представления иерархии "часть-целое". Этот паттерн используется для работы с объектами как с единичными, так и с составными единицами, предоставляя единый интерфейс для работы с ними. 🚩Зачем нужен? Основная цель паттерна Компоновщик — упростить работу с иерархическими структурами данных. Он позволяет клиенту обращаться с отдельными объектами и их группами единообразно, что делает код более гибким и упрощает его поддержку. 🚩Как используется паттерн Компоновщик? 🟠Лист (Leaf): это базовый элемент без подкомпонентов. 🟠Компоновщик (Composite): это элемент, который может содержать другие компоненты, включая и листья, и другие компоновщики.
from abc import ABC, abstractmethod

# Абстрактный компонент
class Graphic(ABC):
    @abstractmethod
    def draw(self):
        pass

# Лист
class Circle(Graphic):
    def draw(self):
        print("Drawing a Circle")

# Компоновщик
class CompositeGraphic(Graphic):
    def __init__(self):
        self.graphics = []

    def add(self, graphic):
        self.graphics.append(graphic)

    def remove(self, graphic):
        self.graphics.remove(graphic)

    def draw(self):
        for graphic in self.graphics:
            graphic.draw()

# Клиентский код
circle1 = Circle()
circle2 = Circle()
composite = CompositeGraphic()
composite.add(circle1)
composite.add(circle2)

# Рисуем все элементы
composite.draw()
🚩ПлюсыУпрощение работы с иерархиями: Легко обрабатывать как простые, так и составные объекты. Расширяемость: Можно легко добавлять новые типы компонентов. ➖Сложность: Могут возникнуть сложности при управлении более сложными структурами. Ставь 👍 и забирай 📚 Базу знаний

🤔 Что такое контекстный менеджер? Контекстный менеджер в Python — это конструкция, которая управляет ресурсами и обеспечивает выполнение определенных действий до и после использования ресурса. Чаще всего используется с оператором `with`, чтобы гарантировать корректное открытие и закрытие ресурсов, таких как файлы или сетевые соединения. В классе контекстного менеджера должны быть реализованы методы `__enter__()` и `__exit__()`. Этот механизм помогает избежать ошибок, связанных с неправильным управлением ресурсами. Ставь 👍 и забирай 📚 Базу знаний

Самые полезные фишки нашего CHAT GPT: Устали от однообразия? Исследуйте удивительные возможности ChatGPT и сделайте свой день более продуктивным! Chat GPT уже умеет: - планировать твой день, чтобы он был продуктивным - помогает с учебой и работой - дает идеи для заработка и улучшения финансового состояния - пообщается с вами как психолог или друг, если вам трудно Не упусти шанс изменить свою жизнь! Забирай бесплатный доступ к ChatGPT и начни путь к своему успеху уже сегодня! Попробовать #реклама 16+ О рекламодателе

🤔 Что такое паттерн Мост (Bridge)? Паттерн "Мост" (Bridge) является структурным паттерном проектирования, который предназначен для разделения абстракции и реализации так, чтобы они могли изменяться независимо друг от друга. Этот паттерн полезен, когда класс должен работать с различными платформами или когда нужно избежать жесткой связки между абстракцией и ее реализацией. 🚩 Зачем нужен 🟠Разделение абстракции и реализации: Он позволяет отделить абстракцию от ее реализации, что упрощает поддержку и расширение системы. 🟠Уменьшение количества подклассов: Без применения этого паттерна, если у нас есть несколько вариантов абстракции и несколько вариантов реализации, то нам пришлось бы создавать классы для всех возможных комбинаций, что приводит к взрывному росту количества классов. 🟠Гибкость: Это позволяет изменять и абстракцию, и реализацию независимо друг от друга. 🚩Как используется 🟠Абстракция (Abstraction): Определяет интерфейс и хранит ссылку на объект Implementor. 🟠Расширенная абстракция (RefinedAbstraction): Наследует Abstraction и расширяет интерфейс. 🟠Реализатор (Implementor): Определяет интерфейс для всех реализаций. 🟠Конкретный реализатор (ConcreteImplementor): Реализует интерфейс Implementor. Допустим, у нас есть программа для управления различными типами устройств (например, телевизор и радио), которые можно включать и выключать. Мы хотим, чтобы способ управления устройствами мог изменяться независимо от типов устройств.
# Implementor
class Device:
    def is_enabled(self):
        pass

    def enable(self):
        pass

    def disable(self):
        pass

# ConcreteImplementor
class TV(Device):
    def __init__(self):
        self._on = False

    def is_enabled(self):
        return self._on

    def enable(self):
        self._on = True

    def disable(self):
        self._on = False

class Radio(Device):
    def __init__(self):
        self._on = False

    def is_enabled(self):
        return self._on

    def enable(self):
        self._on = True

    def disable(self):
        self._on = False

# Abstraction
class RemoteControl:
    def __init__(self, device):
        self._device = device

    def toggle_power(self):
        if self._device.is_enabled():
            self._device.disable()
        else:
            self._device.enable()

# RefinedAbstraction
class AdvancedRemoteControl(RemoteControl):
    def mute(self):
        print("Device is muted.")

# Клиентский код
tv = TV()
remote = RemoteControl(tv)
remote.toggle_power()  # Включает TV

radio = Radio()
advanced_remote = AdvancedRemoteControl(radio)
advanced_remote.toggle_power()  # Включает Radio
advanced_remote.mute()  # Заглушает Radio
Ставь 👍 и забирай 📚 Базу знаний