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

2 投票
4 回答
2485 浏览
提问于 2025-04-17 01:14

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

为什么这段代码会失败,我该怎么做才能实现呢?

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

mc=MyClass()

4 个回答

1

你做的事情其实是递归,也就是说你创建的 MyClass 的新实例会又创建一个新的实例,然后这个新的实例又会创建另一个,以此类推……所以我猜这就是你代码出错的原因。不过我不能确定,因为你没有贴出错误信息。

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()
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。

撰写回答