python类是否可以包含自身的实例,因为数据容器可能如下所示?
class A:
def __init__(self, val):
self.a = A(val)
self.val = val
aa = A(2)
#this will cause RuntimeError: maximum recursion depth exceeded
我的目的是使用此类作为数据容器包含内部副本,如果它被用于减少deepcopy操作。 它可以用作“撤销”链,在必要时提供获取初始值的机会。
这样的行动是否可能?
答案 0 :(得分:6)
由于已经给出的原因,这不起作用:
A(2)
并调用A.__init__
。A.__init__
来电A(val)
。A(val)
来电A.__init__
。我假设您正在这样做,以便您记录val
已经存在的内容;也就是说,如果某个时候您决定希望val
改为3
,则不要丢弃原始值2
。怎么样:
class A( object ):
@property
def val( self ):
return self.history[ -1 ]
@val.setter
def val( self, value ):
self.history.append( value )
def __init__( self, val ):
self.history = [ ]
self.val = val
A( object )
:类现在应该从object
继承。只是因为,基本上。@property
:这告诉python每次我们要求A.val时,它应该调用A.val()并返回结果。这是装饰者;查找property
内置函数以获取更多信息。@val.setter
:这与上面类似,但告诉Python每次我们尝试分配给A.val
时,它应该调用以下函数。它不是设置A.val
,而是将值附加到历史记录列表中。答案 1 :(得分:3)
是的,一个类可以包含一个自己的实例,由于其他人描述的原因,你无法在启动时创建它。
例如,这个类会这样做,
class A:
def __init__(self,value):
self.value=value
def setProperty(self,subvalue):
self.innerInstance=A(subvalue)
然后你可以实例化它并设置它自己的内部副本:
>>>OuterInstance=A(123)
>>>OuterInstance.setProperty(456)
并验证它是否有效:
>>>OuterInstance.innerInstance.value
456
答案 2 :(得分:1)
嗯,你在self.a中所拥有的课程也有self.a,而且没有尽头。我不确定我是否达到了你正在做的目的,但你可能会尝试这样的事情:
class A:
def __init__(self, val, copy = True):
if copy:
self.a = A(val, False)
self.val = val