Python:递归创建对象

时间:2012-09-15 22:41:03

标签: python recursion

我想创建其类型与声明它们的类相同的变量:

Class C:
    def __init__(self):
        self.v = C()

它不起作用,是否有一些技巧可以使这项工作?

5 个答案:

答案 0 :(得分:3)

Python不使用静态类型,因此不需要为类中的引用向相同类型的对象执行特殊操作。

class Node:
    def __init__(self, left=None, right=None):
        self.left = left
        self.right = right

leaf1 = Node()
leaf2 = Node()
parent = Node(leaf1, leaf2)

答案 1 :(得分:2)

另一种解决方案可能是使用getter,它会在您需要时创建变量。

Class C:
    def __init__(self):
        self.v = None

    def get_v(self):
        if self.v == None:
            self.v = C()
        return self.v

更新:这将根据需要使用新实例扩展C实例链,懒洋洋地创建一个“无限”的C链。但是,由于事实证明原始问题的目标是红黑树,这个解决方案不起作用,因为它会在访问时将nil-trees(leafs)扩展到树节点。

答案 2 :(得分:1)

如果你这样做,你就不会得到无限循环。

修改

class C:
    def __init__(self, member):
        self.v = member

if __name__ == "__main__":
    a = C(None)
    b = C(a)

第一个实例需要一个虚假的参数才能使这个版本正常工作,但就像我在评论中说的那样,我不明白你为什么要这样做。

答案 3 :(得分:1)

您真正描述的是某种形式的链表。你可以这样做:

class C:
    def __init__(self):
        self.v = None

object_1 = C()
object_2 = C()
object_1.v = object_2

你正在做的事情不起作用是因为,你告诉C要做的唯一事情是将一个公共数据成员设置为C.因此,你得到一个无限循环,因为这是所有C知道的怎么做,如下图所示:

C's Procedure: When C is made, set a data member to a new C object

(然后当它运行时你会得到类似的东西)

object = C()
# -> Object.v = C() <-c2
# --> c2.v = C() <-c3
# ---> c3.v = C() <- c4
# ....
# ....->cInfinity.v = c()

因此,将v设置为none,会发生以下情况。

object_1 = C()
# -> object_1.v = None
object_2 = C()
# -> object_2.v = None

object_1.v = object_2
# -> object_1.v = object_2

答案 4 :(得分:0)

另一种方法是使用 defaultdict,将其初始化为类名。

class Directory(defaultdict):
  def __init__(self):
    super().__init__(Directory)

例如,这将为您提供一本字典,其中包含一个子级别的字典。您可以将其与 Node 对象一起使用。