2011-11-08 66 views
1

我的問題可能是最容易看到的代碼。我願做以下如何在Python中遞歸調用構造函數(__init__)?

class A(): 
    def __init__(self, i): 
     self.i = i 
     if i > 0: 
      self.a = A(i-1) 

的想法是,我想創建一個類A型是可以遞歸調用自己的構造。如果我上面代碼中並嘗試創建一個實例,我得到以下:

a = Test(3) 
---> self.a = A(i-1) 
NameError: global name 'A' is not defined 

是否有可能有一個類,遞歸調用自己的構造?如果是這樣,它是如何完成的?

+1

您的代碼工作並不會引發錯誤。 –

+0

你的代碼對我來說很好,在XP上使用python 2.7.1 – Nate

+1

似乎你把'A'改名爲'Test',但忘了將它重新命名...... – Philipp

回答

4

似乎我工作的很好a = A(3),爲什麼是你的a = Test(3)?我猜這就是問題所在,如果你命名了你的班級Test,那麼你應該使用self.a = Test(i-1)

>>> class A(): 
...  def __init__(self, i): 
...   self.i = i 
...   if i > 0: 
...    self.a = A(i-1) 
... 
>>> a = A(3) 
>>> a.i 
3 
>>> a.a.i 
2 
>>> a.a.a.i 
1 
>>> a.a.a.a.a 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: A instance has no attribute 'a' 
+0

啊哈!原來,我得到的結果與我使用香草python時完全一樣。我正在使用iPython在django應用程序中使用shell_plus。原來這個錯誤與我的特定環境有關,而不是python本身。謝謝! – EliRibble

3

要遞歸調用「構造」(實際上是初始化;見here)你這樣做:

class A(): 
    def __init__(self, i): 
     self.i = i 
     if i > 0: 
      self.__init__(i-1) 

但我懷疑是不是你打算做什麼。您的示例代碼是遞歸創建A類型的實例並將它們存儲在彼此之中。

+1

+1爲「初始化程序」提及。 – jldupont

+0

是的,我原來的帖子並不完全清楚。我確實想遞歸創建實例 - 我正在構建一個像樹結構的東西。 – EliRibble

相關問題