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操作.它可以用作"撤销"链,有机会在必要时获取初始值.
这样的行动有可能吗?
由于已经给出的原因,这不起作用:
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
Run Code Online (Sandbox Code Playgroud)
A( object ):类现在应该继承自object.只是因为,基本上.@property:这告诉python每次我们要求A.val时,它应该调用A.val()并返回结果.这是一个装饰者 ; 查找property内置函数以获取更多信息.@val.setter:这与上面类似,但告诉Python每次我们尝试分配A.val它时应该调用以下函数.它不是设置A.val,而是将值附加到历史列表中.是的,一个类可以包含其自身的实例,由于其他人描述的原因,您不能在启动时创建它。
例如,此类将做到这一点,
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)