2011-07-17 3 views
0

私はツリーを構築しようとしています。 - 私は、コードの次の部分で物乞い:その私が教えるを使用していますマニュアルとして行うことになっているものので、書き込み後Python:Building trees

>>> class tree: 
    def __init__(self, charge, left=None, right=None): 
     self.charge = charge 
     self.left = left 
     self.right = right 

>>> class tree: 
    def __str__(self): 
     return str(self.charge) 

私は次の

>>> left = tree(2) 

を書くことを私はこれを書きます。 は、しかし、私はこのエラーを取得する:

Traceback (most recent call last): 
File "<pyshell#23>", line 1, in <module> 
left = tree(2) 
TypeError: this constructor takes no arguments 

にはどうすれトップへダウンからbegginingのコードでツリーを構築することができますか? ところで私のpythonのバージョンは2.7.2です ありがとうございました。

+3

なぜpyshellでコーディングしていますか? 'class tree'を2回目に定義すると、最初の定義を上書きしてしまい、コンストラクタが失われてしまいます。 – tomasz

+0

また、タブの代わりにスペースを使用してインデントすることをお勧めします。スペースとタブの混在を使用していましたが、これは最悪です!それはあなたの書式設定を台無しにしていた。 – senderle

答えて

7

クラスを定義してから再定義しています。 class tree:と言うたびに、新しいクラス定義を作成し、前のクラス定義を上書きします。 treeの最後の定義には__init__メソッドが定義されていないため、引数はありません。

インタラクティブなインタプリタでこれを実行しているという事実は、空白行に入力するたびに作業中の定義を終了するので、事を複雑にします。クラスに関しては、単にテキストファイルmytree.pyを編集し、次に>>> import mytreeと入力する方が良いでしょう。

また、クラス定義の方法としてclass foo:が使用され、Python 2については、非常に古いマニュアルです。 Pythonの2の最新バージョンを使用するときは、この操作を行う必要があります。

class Tree(object): 
    def __init__(self, ...) 
    ... 

をdelnanが指摘するように、あなたは明示的にはPython 3にobjectから継承する必要はありませんので、あなたは、空の括弧を残すことができます。確かに、あなたはそれらを完全に省略することができます。私の目は、不在時に括弧を逃しますが、Dive Into Python 3にはそれらがまったく含まれていません。

+0

Python ** 3の素材でない限り、3.xは感謝して古いスタイルのクラスを削除しました。 – delnan

+0

@delnan、私はそれを考えて、ほとんどそれを私の答えに入れました。しかし、 'object'から明示的に継承することは、コードが2と3で同じように動作することを保証していませんか?それは私にとっては良い習慣のようです。しかし、私は確信していません...あなたはどう思いますか? – senderle

+0

両方のメジャーバージョンで動作するコードを書くことはできません。また、2つのバージョンのコード間に構文上の不一致が生じるいくつかの違いがあります。両方をサポートしたいのであれば、慣用的な2.xコードを書いて2to3を実行してください(おそらく、2to3が処理できないセマンティックな変更のためのパッチ)。 – delnan

関連する問題