Python3和递归类

Mic*_*has 2 python recursion class 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
Run Code Online (Sandbox Code Playgroud)

好吧tree()不行.

NameError: global name 'tree' is not defined
Run Code Online (Sandbox Code Playgroud)

错误self.tree():

AttributeError: 'tree' object has no attribute 'tree'
Run Code Online (Sandbox Code Playgroud)

我不知道如何(或如果)使用self.__init__self.__new__在此上下文中.

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

Ray*_*ger 7

您不需要嵌套类以实现容器模式.

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()
Run Code Online (Sandbox Code Playgroud)

问题:

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

直接回答:

嵌套类定义不会给Python带来任何好处,因为它们的作用域不嵌套(内部类的内容不能直接引用封闭类).

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

随后的评论:

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

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

后来的评论:

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

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

  • @Michas:嵌套类*可读性低*.它只会造成混乱,因为人们期望在全局范围内定义类.将类定义放在其他作用域中只有在需要动态定义类或类需要特定动态作用域时才有用(但仍然令人困惑).只是嵌套类没有任何好处,只有缺点. (2认同)
  • @Michas:但是让它们嵌套只会让你更加困惑.除非你有令人困惑的命名,否则在全局范围内拥有超过7个类并不困惑.大多数人不能同时保留3到5个东西,这并不能阻止他们使用具有大量类和方法的模块.如果你想按命名空间分隔类,我建议使用模块.再次:嵌套类*增加了*混乱和复杂性.**没有任何好处**. (2认同)