大多数用于从模型中提取视图信息的Pythonic Double Dispatch



我正在使用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中多方法的这种答案。

最新更新