繁体   English   中英

使用python中相同类的定义创建类的实例

[英]create instance of a class in the same class's definition in python

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

为什么此代码失败,如何实现?

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

mc=MyClass()

好吧,它失败了,因为它具有无限递归。 想想看,如果每个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。

你让一个无限递归调用- 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()

实际上,您执行的操作是递归的,MyClass的新实例将创建一个新实例,该实例又将创建一个新实例,依此类推。等等。我想这就是您的代码失败的原因,因为您没有发布错误消息。

我建议定义两个类:

class MyClass(object):
    def __init__(self):
        self.child = MyChildClass()
    ...many other methods...

class MyChildClass(MyClass):
    def __init__(self):
        pass

我认为,如果两个类必须以两种不同的方式表现,则它们必须是不同的(尽管一个类可以继承另一个类)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM