Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python3和递归类_Python_Python 3.x_Class_Oop_Recursion - Fatal编程技术网

Python3和递归类

Python3和递归类,python,python-3.x,class,oop,recursion,Python,Python 3.x,Class,Oop,Recursion,我想定义自己的树状类。我编写了如下代码: class forest: class tree: def __init__(self): self.var_a = [] self.var_b = [] #Or something as simple def mk(self,som

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

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()
的错误:

我不知道在这种情况下如何(或是否)使用
self.\uuuuu init\uuuu
self.\uuuuu new\uuuuu

问题

可以在Python3中使用递归类吗?这方面的代码是什么样子的?

您不需要嵌套类来实现

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

    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,我们发现类是一种方便的组织代码的方式,可以明确哪些函数操作哪些数据。你怎么做是品味的问题

稍后的评论:

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


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

我刚刚尝试过这一点,可以在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()
这样,您就不必用“树”类污染全局名称空间


尽管由于混淆/可读性问题,您不喜欢这样做,但您始终可以按照前面所述创建一个单独的树类。

您需要
forest.tree
,因为
类位于
forest
类内。它看起来很有效。不过,我在编写简单的测试用例时遇到了问题…@Michas如果你的问题得到了回答,请将其标记为已接受。我不需要使用类。函数和字典就足够了。@Michas:这会带来极大的不便,而且不是惯用语。不嵌套类至少同样方便,而且在Python世界中更为常见。我有时发现嵌套类可以用来代替仅为名称空间目的创建单独的模块。例如,我有一个类
,然后在其中有一个类,它是一个名为
落叶
的子类,因此用户只需进入
树.落叶
即可访问该类。另外,当我使用元类时,我喜欢直接在类内部声明元类,而不是单独声明。但是,可以肯定的是,类嵌套有用的环境有点狭窄。@Michas:嵌套类的可读性较差。这只会造成混乱,因为人们希望在全局范围内定义类。只有当您需要动态定义类或类需要特定的动态范围时,将类定义放在其他范围中才有用(但仍然容易混淆)。仅仅嵌套类并没有任何好处,只有缺点。@Michas:但让它们嵌套只会让人更加困惑。在全局范围内有7个以上的类并不令人困惑,除非您有令人困惑的命名。大多数人不能一次记住超过3到5件事情,这并不能阻止他们使用具有大量类和方法的模块。如果您想按名称空间分隔类,我建议使用模块。同样:嵌套类增加了混乱和复杂性。没有好处。
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()