我正在尝试在MyClass的定义中创建一个新的MyClass实例。
为什么这段代码失败了,怎么能实现呢?
class MyClass:
def __init__(self):
self.child=MyClass()
mc=MyClass()
答案 0 :(得分:7)
嗯,它失败了,因为它有无限的递归。想一想,如果每个MyClass都有一个MyClass的孩子,那么它将继续无限!
您可以通过以下两种方式解决此问题。首先,您可以为构造函数提供参数:
class MyClass:
def __init__(self, create = True):
if create:
self.child = MyClass(False)
mc = MyClass()
或者,您可以使用另一种外部方法:
class MyClass:
def set_child(self,child = None):
# I prefer to make child optional for ease of use.
child = MyClass() if child is None else child
self.child=child
mc=MyClass()
mc.set_child()
我个人更喜欢第一种解决方案,因为它意味着外部对象不需要知道关于该类的任何信息。当然,你可以将两者结合起来:
class MyClass:
def __init__(self, create):
if create:
self.set_child(create=False)
def set_child(self,child = None, create = True):
child = MyClass(create) if child is None else child
self.child=child
mc=MyClass()
这样mc默认有一个孩子,你可以选择随时设置孩子。
然后还有“让我们创造一定数量”的方法:
class MyClass:
def __init__(self, count = 10):
count -= 1
if count:
# the first child gets the value 9.
# the second gets 8.
# when the count gets to 0, stop!
self.child = MyClass(count)
除此之外:如果要获取对象的类,可以使用值obj.__class__
。这将在上面的所有示例中输出MyClass。
答案 1 :(得分:5)
您正在进行无限递归调用 - MyClass
在初始化期间创建另一个MyClass
,因此无限地递归。
您可能希望执行以下操作:
class MyClass:
def create_child(self):
self.child=MyClass()
mc=MyClass()
mc.create_child()
如果你觉得特别顽皮,你可以尝试:
class MyClass(object):
@property
def child(self):
if self._child is None: self._child = MyClass()
return self._child
def __init__(self):
self._child=None
mc=MyClass()
答案 2 :(得分:1)
你所做的是实际的递归,MyClass的新意图将创建一个新的实例,反过来创建一个新的实例,等等...... 所以我说这就是为什么你的代码失败了,我无法确定,因为你没有发布错误信息。
答案 3 :(得分:1)
我建议定义两个类:
class MyClass(object):
def __init__(self):
self.child = MyChildClass()
...many other methods...
class MyChildClass(MyClass):
def __init__(self):
pass
我认为如果两个类必须以两种不同的方式运行,它们必须是不同的(尽管可以将另一个子类化为另一个)