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

xia*_*012 1 python class instance

我试图在MyClass的定义中创建一个新的MyClass实例.

为什么这段代码失败了,如何实现呢?

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

mc=MyClass()
Run Code Online (Sandbox Code Playgroud)

cwa*_*ole 7

好吧,它失败了,因为它有无限的递归.想想看,如果每个MyClass都有一个MyClass的孩子,那么它将继续无限!

您可以通过以下几种方式解决此问题.首先,您可以为构造函数提供参数:

class MyClass:
   def __init__(self, create = True):
      if create:
         self.child = MyClass(False)

mc = MyClass()
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用另一种外部方法:

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()
Run Code Online (Sandbox Code Playgroud)

我个人更喜欢第一种解决方案,因为它意味着外部对象不需要知道关于类的任何信息.当然,你可以将两者结合起来:

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()
Run Code Online (Sandbox Code Playgroud)

这样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)
Run Code Online (Sandbox Code Playgroud)

旁白:如果要获取对象的类,可以使用该值obj.__class__.这将在上面的所有示例中输出MyClass.


小智 5

你正在进行无限递归调用 - 在初始化期间MyClass创建另一个调用MyClass,因此它无限地递归.

您可能想要做以下事情:

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

mc=MyClass()
mc.create_child()
Run Code Online (Sandbox Code Playgroud)

如果你感觉特别顽皮,你可以尝试:

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()
Run Code Online (Sandbox Code Playgroud)