我想创建类型与声明它们的类相同的变量:
Class C:
def __init__(self):
self.v = C()
它不起作用,是否有一些技巧可以使它起作用?
Python 不使用静态类型,因此不需要对类内对相同类型对象的引用做一些特殊的事情。
class Node:
def __init__(self, left=None, right=None):
self.left = left
self.right = right
leaf1 = Node()
leaf2 = Node()
parent = Node(leaf1, leaf2)
另一种解决方案可能是使用 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(叶子)扩展到树节点。
如果你这样做,你不能得到一个无限循环。
编辑:
class C:
def __init__(self, member):
self.v = member
if __name__ == "__main__":
a = C(None)
b = C(a)
第一个实例需要一个虚假参数才能使此版本正常工作,但就像我在评论中所说的那样,我不明白您为什么要这样做。
您真正描述的是某种形式的链表。你可以这样做:
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
另一种方法是使用默认字典,将其初始化为类名。
class Directory(defaultdict):
def __init__(self):
super().__init__(Directory)
例如,这将为您提供一个包含一个子级字典的字典。您可以将它与您的 Node 对象一起使用。