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

K. *_* C 7 python recursion class

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
Run Code Online (Sandbox Code Playgroud)

我的目的是使用这个类作为数据容器包含一个副本,如果它被用于减少deepcopy操作.它可以用作"撤销"链,有机会在必要时获取初始值.

这样的行动有可能吗?

Kat*_*iel 7

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

  1. Python看到A(2)并调用A.__init__.
  2. A.__init__电话A(val).
  3. A(val)电话A.__init__.
  4. GOTO 2

我假设你这样做是为了记录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
Run Code Online (Sandbox Code Playgroud)

说明

  • A( object ):类现在应该继承自object.只是因为,基本上.
  • @property:这告诉python每次我们要求A.val时,它应该调用A.val()并返回结果.这是一个装饰者 ; 查找property内置函数以获取更多信息.
  • @val.setter:这与上面类似,但告诉Python每次我们尝试分配A.val它时应该调用以下函数.它不是设置A.val,而是将值附加到历史列表中.


D M*_*ell 6

是的,一个类可以包含其自身的实例,由于其他人描述的原因,您不能在启动时创建它。

例如,此类将做到这一点,

class A:
    def __init__(self,value):
        self.value=value
    def setProperty(self,subvalue):
        self.innerInstance=A(subvalue)
Run Code Online (Sandbox Code Playgroud)

然后可以实例化它,并设置它的内部副本,如下所示:

>>>OuterInstance=A(123)
>>>OuterInstance.setProperty(456)
Run Code Online (Sandbox Code Playgroud)

并验证它是否可以使用:

>>>OuterInstance.innerInstance.value
456
Run Code Online (Sandbox Code Playgroud)