我正在使用Pyside编码一个带有Python和Qt的桌面应用程序。我需要显示一个树视图,其中顶级项目是与孩子不同类型的对象。具体而言,顶级项目是git存储库,而其子女是工作树中的目录。
对于存储库,我想显示其路径并目前检查分支。对于目录,我只想显示其名称。
现在,我是通过在基础模型对象上使用QAbstractItemModel
后代使用isinstance
(从internalPointer()
方法检索)并决定如何格式化结果字符串。
我想知道是否有更多的Pythonic(或更笨拙)进行这种双重调度的方式。
我不想做的是在我的git reto和工作树文件的模型类中为此目的定义一种方法,因为我觉得这会违反srp。
最欢迎任何想法或想法。另外,如果有人想到这个问题不那么笨拙的标题,请告诉我;)
如果每个模型类都具有包含视图代码的函数,则可以调用这些函数。为了在不使用isinstance
的情况下分离模型/查看代码,这听起来像是访问者模式的情况,如此SO答案所述,并在AST模块中使用。
基本上,每个模型类都有一个accept()
方法,该方法采用访问者对象。存储库的accept()
方法调用该访问者对象的visit_repository()
方法,传递self
(这是模型实例)。同样,目录的accept()
方法调用该访问者对象的visit_directory()
方法传递self
。然后,visit_repository()
或visit_directory()
方法可以访问模型实例,并且知道其类型并可以显示适当的视图。这将视图代码(在访问者对象中)与模型代码(在模型类中)分开。
*注意:而不是使用不同的函数名称(visit_repository()
vs visit_directory()
),您可以使用多途径,例如,有关Python中多方法的这种答案。