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中使用递归类吗?这个代码看起来怎么样?
您不需要嵌套类以实现容器模式.
将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,我们发现类是组织代码的便捷方式,可以清楚地说明哪些函数对哪些数据进行操作.如何你做到这一点是口味的问题.
后来的评论:
嵌套类有一个好处.它的定义不在全球范围内.
这也可能是一个缺点,使得重用代码变得更加困难,更难以测试,并且可能使内省工具混乱.