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