2

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

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

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

4

5 回答 5

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)
于 2012-09-15T22:46:40.890 回答
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(叶子)扩展到树节点。

于 2012-09-15T22:49:54.057 回答
1

如果你这样做,你不能得到一个无限循环。

编辑

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

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

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

于 2012-09-15T22:41:54.380 回答
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为无,会发生以下情况。

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

object_1.v = object_2
# -> object_1.v = object_2
于 2012-09-15T22:49:44.187 回答
0

另一种方法是使用默认字典,将其初始化为类名。

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

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

于 2021-01-05T03:31:04.670 回答