1

我正在使用 PySide 使用 Python 和 Qt 编写桌面应用程序。我需要显示一个树视图,其中顶级项目是与其子项不同类型的对象。具体来说,顶级项目是 Git 存储库,而其子项目是工作树中的目录。

对于存储库,我想显示其路径和当前签出的分支。对于一个目录,我只想显示它的名称。

现在,我通过让我的QAbstractItemModel后代使用isinstance底层模型对象(从internalPointer()方法中检索)并决定如何格式化结果字符串来做到这一点。

我想知道是否有一种更 Pythonic(或者不那么笨重)的方式来进行这种双重调度。

我不想做的是在我的 Git repo 和工作树文件的模型类中为此目的定义一个方法,因为我觉得这会违反 SRP。

任何想法或想法都是最受欢迎的。另外,如果有人能为这个问题想出一个不那么笨拙的标题,请告诉我;)

4

1 回答 1

0

如果您对每个 Model 类都有一个包含 View 代码的函数感到满意,那么您可以调用这些函数。要在不使用的情况下分离模型/视图代码isinstance,这听起来像是访问者模式的一个案例,如this SO answer中所述,并在ast 模块中使用。

基本上,每个模型类都有一个accept()接受访问者对象的方法。存储库的方法accept()调用该visit_repository()访问者对象的方法,传递self(即模型实例)。同样,accept()目录的方法调用该visit_directory()Visitor 对象的方法,传递self. visit_repository()or方法然后visit_directory()可以访问 Model 实例并知道它的类型并可以显示适当的视图。这将视图代码(在访问者对象中)与模型代码(在模型类中)分开。

*注意:您可以使用多方法,而不是使用不同的函数名称(visit_repository()vs visit_directory()),例如,this SO answer about multimethods in Python。

于 2013-07-07T02:11:05.390 回答