2011-11-08 10 views
1

私の質問はおそらくコードで見るのが最も簡単です。私は、次のPythonでどのように再帰的にコンストラクタ(__init__)を呼び出しますか?

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

アイデアは、私は再帰的に独自のコンストラクタを呼び出すことができますタイプAのクラスを作成したいということですやりたいです。私は上記のコードとAのインスタンスを作成しようとすると、私は、次を得る:

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

再帰的に独自のコンストラクタを呼び出すクラスを持ってすることが可能ですか?もしそうなら、それはどうやって行なわれますか?

+1

コードは動作しますが、エラーは発生しません。 –

+0

あなたのコードはpython 2.7.1を使ってXP上でうまく動作します – 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

Aha!あなたがバニラ・パイソンを使うときとまったく同じ出力を得ることが分かります。私は、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