2011-09-02 127 views
0

我想在MyClass的定義中創建一個新的MyClass實例。在python中創建同一類的定義的類的實例

爲什麼此代碼失敗,怎麼實現呢?

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

mc=MyClass() 
+1

你不能。你究竟在做什麼? –

+0

我正在創建一棵樹,它可以有孩子。他們是同一班。 – xiaohan2012

+1

這種方法會無休止地循環(如果它能工作的話)。 – rplnt

回答

7

那麼,它失敗,因爲它具有無限遞歸。想想看,如果每個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。

+0

非常全面和說明性。 – xiaohan2012

5

你讓一個無限遞歸調用— 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() 
+0

'MyClass'正在創建另一個'MyClass'。我不太明白。你能解釋一下嗎?您提供的代碼很有用,謝謝。:-) – xiaohan2012

+0

哦,現在對我來說很有意義。 :-) – xiaohan2012

+0

旁白,你能告訴@property的用法是什麼嗎?謝謝。這對我來說是新的。 – xiaohan2012

1

你在那裏做的是真實的遞歸,MyClass的新的實例將創建一個新的實例,將反過來創建一個新的實例,等等......我很自稱這就是爲什麼你的代碼失敗,我不能因爲您沒有發佈錯誤消息,所以請確認。

1

我建議定義兩個類:

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

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

我認爲,如果兩個類必須在兩個不同的行爲方式,他們必須是不同的(儘管可以子類除外)

+0

這對我來說似乎不穩定和不必要。 –

相關問題