我想创建其类型与声明它们的类相同的变量:
Class C:
def __init__(self):
self.v = C()
它不起作用,是否有一些技巧可以使这项工作?
答案 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 对象一起使用。