[英]Python3 and recursive class
我想定義自己的樹狀類。 我寫過這樣的代碼:
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 中使用遞歸類嗎? 這個代碼是怎樣的?
您不需要嵌套類來實現容器模式。
將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,我們發現類是一種組織代碼的便捷方式,可以明確哪些函數對哪些數據進行操作。 你怎么做是一個品味問題。
后來的評論:
嵌套類有一個好處。 它的定義不在全局范圍內。
這也可能是一個缺點,使得重用代碼更加困難,更加難以測試,並且可能會混淆自省工具。
我剛剛嘗試過這個,它可以在 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()
這樣你就不必用“樹”類污染全局名稱空間
但是,如果您由於混淆/可讀性問題不喜歡這個,您可以隨時創建一個單獨的樹類,如前所述。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.