Python3与递归类

2024-06-25 23:45:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我想定义自己的树型类。我写过这样的代码:

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()不起作用。在

^{pr2}$

self.tree()的错误:

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

我不知道在这种情况下如何(或是否)使用self.__init__或{}。在

问题
在Python3中可以使用递归类吗?它的代码是什么样子的?在


Tags: or代码selftree定义initvardef
2条回答

我刚做了这个实验,可以用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()

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

尽管如果您不喜欢这是由于混乱/可读性问题,您可以始终创建一个单独的树类,如前所述。在

不需要嵌套类来实现container pattern。在

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

    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()

问题:

It is possible to use recursive class in Python3? How does the code for this look like?

直接回答:

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

因此,Python中通常的模式是将多个类中的两个类(使用组合而不是继承)直接引用到另一个类中。在

后续评论:

Well. I don't need to use classes. The functions and dictionaries would be enough.

函数和字典总是足够的(Python的早期版本没有类)。噢,我们发现类是组织代码的一种方便的方式,可以清楚地知道哪些函数对哪些数据进行操作。你怎么做这是一个品味问题。在

稍后评论:

There is one benefit of nested class. Its definition doesn't reside in global scope.

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

相关问题 更多 >