【问题标题】:create instance of a class in the same class's definition in python在python中的同一个类的定义中创建一个类的实例
【发布时间】:2011-09-02 12:35:01
【问题描述】:

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

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

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

mc=MyClass()

【问题讨论】:

  • 你不能。你到底想做什么?
  • 我正在创建一棵树,它可以有孩子。他们属于同一类。
  • 这种方法会无限循环(如果可行的话)。
  • 他们可以有孩子。如果您在这样的构造函数中创建它,它们将始终有孩子。你应该分配 self.child = None 并且只在他们应该有孩子的时候将 self.child 分配给他们。
  • 附带说明,最好总是创建继承自 object 的新类,而不是什么都没有 (class MyClass(object):...),这样您就可以使用 new-style classes .

标签: python class instance


【解决方案1】:

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

【讨论】:

  • 相当全面和说明性。
【解决方案2】:

您正在进行无限递归调用 - 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 正在创建另一个MyClass。我不太明白。你能再解释一下吗?您提供的代码很有用,谢谢。:-)
  • 哦,这对我来说很有意义。 :-)
  • 题外话,能说说@property的用法叫什么吗?谢谢。这对我来说是新的。
【解决方案3】:

您在那里所做的实际上是递归的,MyClass 的新实例将创建一个新实例,该实例又将创建一个新实例,等等...... 所以我想这就是你的代码失败的原因,我不能肯定,因为你没有发布错误消息。

【讨论】:

    【解决方案4】:

    我建议定义两个类:

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

    我认为如果两个类必须以两种不同的方式表现,那么它们一定是不同的(尽管一个可以子类化另一个)

    【讨论】:

    • 这对我来说似乎是不稳定且不必要的。
    猜你喜欢
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-11-02
    • 1970-01-01
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多