💀
Второй курс РПО
Разработка программных модулей
Разработка программных модулей
  • Модели разработки
  • Ошибки и отладка программ
  • Средства разработки алгоритмов
    • Основные принципы и стадии тестирования
  • Сложностные классы
  • Эмуляторы операционных систем
  • Сложность сортировки
  • Уровни тестирования
  • Задание №1
  • Регрессионное тестирование
  • Тестирование «белым ящиком»
  • Как делать оценку сложности?
  • Алгоритмы и сложность
  • Тестирование "белым ящиком" №2
  • Сложность алгоритмов
  • Тестирование "белым ящиком" №3
  • Тестирование "Чёрным ящиком»" №1
  • Тестирование "Черным ящиком" №2
  • Оценка сложности эвристических алгоритмов
  • Принципы ООП
  • Тестирование "Черным ящиком" №3
  • КТ - В3
  • Модульное тестирование
    • С кодами
  • Модульное тестирование
  • Абстрактные классы и интерфейсы в Python
  • Структуры в Python по аналогии с C++
    • Диалоги гениев
  • Делегаты в Python
    • Ещё более не смешные диалоги
  • Регулярные выражения в Python от простого к сложному
  • Python: Коллекции
  • Параметризованные классы (шаблоны)
  • Указатели и операции со списками в Python
  • Интеграционное тестирование
  • Работа с классами. Перегрузка методов
  • Определение операций в классе.
  • Создание наследованных классов
  • Интеграционное тестирование
  • Работа с объектами через интерфейсы
  • Использование стандартных интерфейсов
  • Работа с типом данных "Структура"
  • Коллекции. Параметризованные классы
  • Использование регулярных выражений
  • Операции со списками
  • Что такое паттерны проектирования?
  • Шпаргалка по шаблонам проектирования
    • [Habr] Шпаргалка
  • UML-диаграммы проектирования
  • Использование основных шаблонов.
  • Использование каких то там шаблонов
  • 15-я Практическая
  • 16-я Практическая
  • Graphviz Online
  • 17-я Практическая
  • Введение в теорию программирования: Объектно-ориентированный подход
  • Документирование софта и стандарты
  • C# Ввод и вывод
  • Оптимизация кода: просто о главном
  • Автоматизация разработки технической документации
  • Автоматизированное документирование и первичные данные
  • ADO.NET что это?
Powered by GitBook
On this page

Делегаты в Python

15.01.2025

Вопрос:

Есть ли в Python делегаты, аналогичные public event Action в C#?


Ответы и решения:

  1. DobroAlex:

    • Делегатов в Python в явном виде нет.

    • Можно переопределить метод __iadd__, но возникает вопрос, зачем это нужно.

  2. outoftime:

    • Чтобы решить проблему, необходимо чётко понимать концепции MVC и делегатов.

    • Рекомендуется изучить MVC через Ruby on Rails.

  3. Garry Galler:

    • Делегаты можно реализовать через абстракцию шаблона проектирования.

    • Варианты реализации:

      • Использование миксинов (классов, подмешиваемых к другим).

      • Передача функции-обработчика в качестве параметра класса.


Пример ситуации:

  • Проект на PyQT5 с разделением на файлы view, model, controller.

  • Требуется отделить логику модели от представления. Например:

    • В модели вызывается метод progress() из контроллера.

    • Это нарушает принцип разделения, и для решения нужен делегат.

Пример кода из model:

import controller

class Archiver(controller.Controller):
    def pack(self):
        self.res = bytearray()
        self.step = 0
        with open(self.lineEdit.text(), 'rb') as f:
            byte_arr = f.read()
        count = 1

        self.remember_file()
        self.move = (50 / (len(byte_arr) - 1))

        for i in range(len(byte_arr) - 1):
            if byte_arr[i] == byte_arr[i + 1]:
                count += 1
            else:
                self.res.append(count)
                self.res.append(byte_arr[i])
                count = 1
            self.progress()

Пример метода progress из controller:

def progress(self):
    self.step += self.move
    self.progressBar.setValue(round(self.step))

Заметки:

  1. Делегаты в Python реализуются через функции обратного вызова (callback).

  2. В данном примере можно:

    • Передавать метод progress как параметр в класс Archiver.

    • Создать интерфейс для вызова делегата.

Пример решения:

class Archiver:
    def __init__(self, progress_callback):
        self.progress_callback = progress_callback

    def pack(self):
        # Логика метода
        if self.progress_callback:
            self.progress_callback()

Использование:

archiver = Archiver(progress_callback=controller_instance.progress)
archiver.pack()

Дополнительно:

  • Принцип MVS не существует. Автор, вероятно, имел в виду либо опечатку, либо путает с MVC.

PreviousДиалоги гениевNextЕщё более не смешные диалоги

Last updated 4 months ago