是的,一个类可以包含本身的实例,您只是因为他人所描述的原因无法在启动下创建它。例如,此类会这样做,
class A:
def __init__(self,value):
self.value=value
def setProperty(self,subvalue):
self.innerInstance=A(subvalue)
然后,您可以实例化并以这样的方式设置其内部副本:
验证它可以使用:
>>>OuterInstance.innerInstance.value
456
由于已经给出的原因,这是行不通的:
pypython看到
A(2)
并致电
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
property
内置功能以获取更多信息。
@val.setter
A.val
时,都应该调用以下功能。它没有设置
A.val
,而是将值附加到历史记录列表中。
class A:
def __init__(self, val, copy = True):
if copy:
self.a = A(val, False)
self.val = val
python类可以包含一个本身的实例。这对于比较和范围检查特别有用。说,宣布构造函数中的对象将产生无限的递归。它也不会导致类属性,而是在实例属性中。通常会声明class属性
:
class Shoesize:
min = Shoesize(4)
max = Shoesize(12)
def __init__(self, size):
self.size = size
以这种方式对课程进行分配将导致以下错误:
NameError: name 'Shoesize' is not defined
@total_ordering
class Shoesize:
def __init__(self, size):
self.size = size
def __repr__(self):
return f"Shoesize({self.size})"
def __eq__(self, other):
return self.size == other.size
def __gt__(self, other):
return self.size > other.size
Shoesize.min = Shoesize(4)
Shoesize.max = Shoesize(12)
可以通过课程访问这些属性:
>>> print(Shoesize.min)
Shoesize(4)
>>> s = Shoesize(8)
>>> print(s, s.max, s < s.max)
Shoesize(8) Shoesize(12) True