簡體   English   中英

Python3 和遞歸類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM