具有许多不同节点的树的Python项目结构

时间:2015-08-20 21:50:04

标签: python tree structure

所以,我在python中实现了一个表示数学表达式的数据树,就像这个binary expression tree一样。 每个节点代表一个操作(+,*,exp(),...),每个叶子代表一个数字或变量。因此,我创建了一个模块 Expression.py ,它包含一个父类 Node 和用于数学运算的子类。

现在,随着项目变得越来越复杂,我开始实现越来越多的节点类型来覆盖更多的操作, Node 的每个子类开始有很多方法来完成任务。术语简化等。

到目前为止,我在 Expression.py 文件中实现了所有这些子节点。但它现在是500多行文件,我甚至还没有完成。我试图通过将每个子类放入一个文件(Java样式)并将它们全部合并到一个包中来分割它,这将符合我对正确结构的理解。但是这个实现给我带来了问题,因为 Addition.py Multiplication.py 等不同的模块仍然相互引用。例如。 Addition -object的方法可能会返回乘法 - 对象,反之亦然。

我的问题是:你如何构建这样一个项目?除了将它们放在一个巨大的文件中之外,如何构造相互引用的许多相关子类?

如果我将它们安排在包裹中,我该如何正确导入它们?我将如何正确引用它们?

修改 好吧,让我更具体一点,这是一些示例代码:

class Node():
    def __init__(self):
        pass
    def derive(self):
        pass


class Sine(Node):
    def __init__(self, arg):
        self.arg = arg
    def derive(self):
        return Cosine(self.arg)

class Cosine(Node):
    def __init__(self, arg):
        self.arg = arg
    def derive(self):
        return Multiplication(Num(-1), Sine(self.arg))

class Multiplication:
      ...

如您所见, Sine Cosine 这些类具有循环依赖关系,我无法(明知)分成两个单独的文件。虽然我不想将数千行子类放入一个文件中。这只是示例代码。这些类实际上包含更多行。

1 个答案:

答案 0 :(得分:0)

由于您没有显示任何代码,因此只能给出一般答案。首先,在将所有内容放在一个文件中并将每个类放在一个文件中之间,您可以选择将类组放入模块中。我怀疑你们所有的课程都相互依赖。因此,您需要更好地了解依赖项的结构。如果您了解结构,Python将为您提供在代码中表达此结构的工具。 Mixins,decorators,meta classes,...是表达复杂结构而不会违反DRY的强大工具。所以我的建议是:尝试更好地理解你的结构!