Python3和递归类

时间:2011-12-03 19:48:00

标签: python class recursion python-3.x

我想定义自己的树状类。我编写了这样的代码:

class forest:
        class tree:
                def __init__(self):
                        self.var_a = []
                        self.var_b = []
                        #Or something as simple
                def mk(self,something):
                        #Some instructions
                        self.a = tree()
                        b_var = self.a.mk(a_var)
                        self.b = tree()
                        c_var = self.a.mk(b_var)
                        #Some instructions
                        return ret
        #Some code for class forest

tree()不起作用。

NameError: global name 'tree' is not defined

self.tree()的错误:

AttributeError: 'tree' object has no attribute 'tree'

我不知道在这种情况下如何(或如果)使用self.__init__self.__new__

问题
可以在Python3中使用递归类吗?这个代码看起来怎么样?

2 个答案:

答案 0 :(得分:7)

您无需嵌套类以实现container pattern

Tree 类移到 Forest 之外。 每次树实例化时,它都可以将自己添加到林中:

    class Forest:
            def __init__(self):
                self.mytrees = []
            def add(self, tree):
                self.mytrees.append(self)
            def drop_leaves(self):
                for tree in self.mytrees:
                    tree.drop_leaves()


    class Tree:
            def __init__(self, forest):
                forest.add(self)
                self.var_a = []
                self.var_b = []
                #Or something as simple
            def drop_leaves(self):
                print 'Drop'

    sherwood = Forest()
    t1 = Tree(sherwood)
    t2 = Tree(sherwood)
    sherwood.drop_leaves()

问题:

  

可以在Python3中使用递归类吗?代码如何?   对于这个看起来像?

直接回答:

嵌套类定义并没有赋予Python任何好处,因为它们的作用域不嵌套(内部类的内容不能直接引用封闭类)。

因此,Python中的通常模式是使两个或多个类直接相互引用(使用组合而不是继承)。

后续评论:

  

好。我不需要使用课程。功能和词典   就够了。

函数和字典总是足够的(Python的早期版本没有类)。 OTOH,我们发现类是组织代码的便捷方式,可以清楚地说明哪些函数对哪些数据进行操作。如何这样做是一个品味问题。

以后的评论:

  

嵌套类有一个好处。它的定义不在于   全球范围。

这也可能是一个缺点,使得重用代码变得更加困难,更难以测试,并且可能会混淆内省工具。

答案 1 :(得分:0)

我刚试验过这个,可以在Python3中完成

class forest:
    #Interal Class _tree
    class _tree:
            def __init__(self):
                    self.var_a = []
                    self.var_b = []
                    #Or something as simple
            def mk(self,something):
                    #Some instructions on self.var_a or self.var_b
    def __init__(self):
        #Assign internal class _tree to public variable tree
        self.tree=self._tree()

sherwood=forest()
sherwood.tree.mk()

这样您就不必使用“树”来污染全局名称空间。类

虽然如果由于混淆/可读性问题而不喜欢这种情况,您可以随时创建一个单独的树类。