Большая Pythonic двойная отправка для извлечения Посмотреть информацию из модели
Я пишу настольное приложение на Python и Qt, используя PySide. Мне нужно отобразить древовидное представление, в котором элементы верхнего уровня являются объектами другого типа, чем их дочерние элементы. В частности, элемент верхнего уровня - это Git-репозиторий, а его дочерние элементы - это каталоги в рабочем дереве.
Для хранилища я хочу показать его путь и извлеченную ветку. Для каталога я просто хочу показать его имя.
Прямо сейчас я делаю это, имея QAbstractItemModel
потомок использования isinstance
на базовом объекте модели (извлечено из internalPointer()
метод) и решить, как отформатировать полученную строку.
Мне было интересно, есть ли более питоновский (или просто менее неуклюжий) способ сделать такую двойную рассылку.
Чего я не хочу делать, так это определить метод для этой цели в моих классах моделей для репозитория Git и файла рабочего дерева, потому что я чувствую, что это нарушит SRP.
Любые мысли или идеи приветствуются. Кроме того, если кто-нибудь может придумать менее неуклюжий заголовок для этого вопроса, дайте мне знать;)
1 ответ
Если вы согласны с тем, что у каждого класса Model есть функция, содержащая код View, вы можете просто вызвать эти функции. Разделить код модели / вида без использования isinstance
это звучит как случай для шаблона посетителя, как описано в этом ответе SO, и используется в модуле ast.
По сути, каждый класс Model имеет accept()
метод, который принимает объект Visitor. accept()
метод для хранилища вызывает visit_repository()
метод этого объекта посетителя, передавая self
(который является экземпляром модели). Точно так же accept()
метод для каталога вызывает visit_directory()
метод этого объекта посетителя, передавая self
, visit_repository()
или же visit_directory()
Затем метод получает доступ к экземпляру Model, знает его тип и может отображать соответствующее представление. Это отделяет код View (в объекте Visitor) от кода Model (в классе Model).
* Примечание: вместо использования разных имен функций (visit_repository()
против visit_directory()
), вы можете использовать мультиметоды, например, этот SO-ответ о мультиметодах в Python.