xia*_*012 1 python class instance
我试图在MyClass的定义中创建一个新的MyClass实例.
为什么这段代码失败了,如何实现呢?
class MyClass:
def __init__(self):
self.child=MyClass()
mc=MyClass()
Run Code Online (Sandbox Code Playgroud)
好吧,它失败了,因为它有无限的递归.想想看,如果每个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)
| 归档时间: |
|
| 查看次数: |
1031 次 |
| 最近记录: |