我想定义自己的树状类。我编写了这样的代码:
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中使用递归类吗?这个代码看起来怎么样?
答案 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()
这样您就不必使用“树”来污染全局名称空间。类
虽然如果由于混淆/可读性问题而不喜欢这种情况,您可以随时创建一个单独的树类。