在python的同一个类的定义中创建一个类的实例

时间:2011-09-02 12:35:01

标签: python class instance

我正在尝试在MyClass的定义中创建一个新的MyClass实例。

为什么这段代码失败了,怎么能实现呢?

class MyClass:
        def __init__(self):
                self.child=MyClass()

mc=MyClass()

4 个答案:

答案 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

我认为如果两个类必须以两种不同的方式运行,它们必须是不同的(尽管可以将另一个子类化为另一个)