Большая 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.

Другие вопросы по тегам