[英]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.