我想在MyClass的定義中創建一個新的MyClass實例。在python中創建同一類的定義的類的實例
爲什麼此代碼失敗,怎麼實現呢?
class MyClass:
def __init__(self):
self.child=MyClass()
mc=MyClass()
我想在MyClass的定義中創建一個新的MyClass實例。在python中創建同一類的定義的類的實例
爲什麼此代碼失敗,怎麼實現呢?
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。
非常全面和說明性。 – xiaohan2012
你讓一個無限遞歸調用— 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'。我不太明白。你能解釋一下嗎?您提供的代碼很有用,謝謝。:-) – xiaohan2012
哦,現在對我來說很有意義。 :-) – xiaohan2012
旁白,你能告訴@property的用法是什麼嗎?謝謝。這對我來說是新的。 – xiaohan2012
你在那裏做的是真實的遞歸,MyClass的新的實例將創建一個新的實例,將反過來創建一個新的實例,等等......我很自稱這就是爲什麼你的代碼失敗,我不能因爲您沒有發佈錯誤消息,所以請確認。
我建議定義兩個類:
class MyClass(object):
def __init__(self):
self.child = MyChildClass()
...many other methods...
class MyChildClass(MyClass):
def __init__(self):
pass
我認爲,如果兩個類必須在兩個不同的行爲方式,他們必須是不同的(儘管可以子類除外)
這對我來說似乎不穩定和不必要。 –
你不能。你究竟在做什麼? –
我正在創建一棵樹,它可以有孩子。他們是同一班。 – xiaohan2012
這種方法會無休止地循環(如果它能工作的話)。 – rplnt