在 Python 中使用类实例树

Posted

技术标签:

【中文标题】在 Python 中使用类实例树【英文标题】:Working with trees of class instances in Python 【发布时间】:2011-11-21 13:24:04 【问题描述】:

我正在寻找有关处理类实例树的更多信息,以及如何最好地从树干的叶子上调用方法。我有一个带有许多分支实例(在字典中)的树干实例,每个实例都有许多叶实例(以及分支中的字典)。叶子是动作真正发生的地方,因此叶子中有用于查询值、恢复值和许多其他事情的方法。

这导致感觉像是代码重复,因为我可能想对分支的所有叶子做某事,所以分支中有一些方法可以对叶子、指定的一组叶子或所有叶子做某事该分支已知,尽管这些确实通过简单地循环叶子并要求它们对自己做所说的事情来减少代码重复(因此执行工作的实际代码在叶子类中的一个地方)。

然后树干进来了,我可能想一口气对整棵树(即所有叶子)做点什么,所以我在那里有方法可以要求所有已知对象运行它们的全叶子函数。我开始觉得这种方式与叶子中的实际动作完全不同,尽管它运行良好,而且代码看起来相当紧凑 - 非常简短、可读且运行良好。

另一个问题是逻辑分组。有些数据我可能想与一些、大多数或所有叶子相关联,以表明它们是某个逻辑组的一部分,因此目前叶子本身都在存储这种数据。当我想获得一个逻辑组时,我必须扫描所有叶子并将它们收集起来,而不是在主干级别拥有某种列表。这实际上一切正常,甚至非常合乎逻辑,但感觉很疯狂。这仅仅是使用树状结构的本质,因为它们的复杂性,还是有其他方法可以做这些事情?我不喜欢建立二级结构来连接相反方向的东西——例如。制作一个引用逻辑组中叶子的结构,然后从更像列表的方向接近它们。像这样将所有东西都放在一棵大树上的一个好处是,它可以用泡菜一次性倾倒和装载。

我很想听听其他人在此类事情上的经验的想法。

【问题讨论】:

【参考方案1】:

我从您的问题中得出的结论是“一切正常”,但是代码开始变得难以管理且难以推理,并且:有没有更好的方法来做到这一点?

您的问题缺少的一件事是可靠的上下文。您的树结构实际上解决了什么样的问题?这些对象实际上做了什么?它们都是相同类型的对象,还是混合对象?通过其中一些细节,您可能会得到更实际的回应。

就目前而言,我建议查看design patterns 上的一些资源。特别是 composite 和 visitor 模式。

在书的结尾,您可以查看Design Patterns 和/或Refactoring to Patterns。这些都没有任何 Python 代码,但如果你不介意 Java,后者是一个很好的介绍,可以很好地解释代码结构和使用模式来更好地组织事物。

您还可以看看 Alex Martelli 在 Python Design Patterns 上的演讲。

这个question 有一些关于一般模式和python 的更多资源链接。

希望对您有所帮助。

【讨论】:

谢谢,马克。你对我模糊的提问基本上是正确的。您也不是第一个向我推荐设计模式的人。我想我终于准备好接受这个提示了。我目前正在寻找一本设计模式书。

以上是关于在 Python 中使用类实例树的主要内容,如果未能解决你的问题,请参考以下文章

具有递归的 Python C API - 段错误

如何在决策树中使用python调用每个类的概率值

python kd树 搜索

为啥在 python 中使用类方法而不是实例方法

Python 点滴 IV

无法使用 SWIG 在 Python 中实例化 C++ 类(获取属性错误)