类可以包含自身的实例作为数据容器吗?

时间:2010-07-30 09:38:43

标签: python class recursion

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操作。 它可以用作“撤销”链,在必要时提供获取初始值的机会。

这样的行动是否可能?

3 个答案:

答案 0 :(得分:6)

由于已经给出的原因,这不起作用:

  1. Python看到A(2)并调用A.__init__
  2. A.__init__来电A(val)
  3. A(val)来电A.__init__
  4. GOTO 2
  5. 我假设您正在这样做,以便您记录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