2

私はPythonを初めて使用するので、オブジェクトのインスタンス化についてサポートが必要です。Pythonインタープリターは、私が定義したクラスのオブジェクトをインスタンス化するときに問題を引き起こします。2つのクラスがありBTNodeBST(それぞれファイルに保存されますbst_node.pybst.py

# file: bst_node.py

class BTNode:

    """a binary search tree node implementation"""

    def ___init___(self, value):
        self.value = value
        self.left is None
        self.right is None
        self.parent is None

    def ___init___(self, value, left, right, parent):
        """set the parameters to corresponding class members"""
        self.value = value
        self.left = left
        self.right = right
        self.parent = parent

    def is_leaf(self):
        """check whether this node is a leaf"""
        if self.left.value is None and self.right.value is None:
            return True 
        return False

# file: bst.py

from bst_node import *

class BST:

    """a binary search tree implementation"""
    def ___init___(self, value):
        self.root = BTNode(value)

    def insert(self, curRoot, newValue):
        if curRoot.is_leaf():
            if newValue < curRoot.value:
                newNode = BTNode(newValue, None, None, curRoot)
                curRoot.left = newNode
            else:
                newNode = BTNode(newValue, None, None, curRoot)
                curRoot.right = newNode
        else:
            if newValue < curRoot.value:
                self.insert(curRoot.left, newValue)
            else:
                self.insert(curRoot.right, newValue)

だから、通訳で私はします:

import bst as b
t1 = b.BST(8)

そして私はこれを言うエラーを受け取りますconstructor takes no arguments

コンストラクターは明らかに引数を取るvalueので、ここで何が問題になっていますか?このエラーを修正するにはどうすればよいですか?

ありがとう、すべての助けは大歓迎です!

4

3 に答える 3

5

___init___最初の問題は、の代わりに関数を呼び出したことです__init__。すべての「特別なメソッド」は 2 つのアンダースコアを使用します。

このコードの 2 番目の問題は、BTNodeあなたが再定義したことです__init__。Python では関数をオーバーロードできません。再宣言__init__すると、最初のコンストラクターが効果的に削除されます。

3 番目の問題は、の使用ですisisは、2 つのオブジェクトが完全に同じかどうかを調べてTrueorを返す演算子ですFalse。コンストラクターでは、(まだ宣言されていない)self.left is Noneの値をself.left調べたり、それが であるかどうかを調べたりすることがいくつかありNoneます。設定するには、次のように使用=します。self.left = None

2 番目と 3 番目の問題を修正するには、デフォルトの引数値を使用する必要があります。例えば:

def __init__(self, value, left=None, right=None, parent=None):

于 2013-03-18T20:56:49.637 に答える
4

アンダースコアの問題の数に加えて、置き換える必要があります

def ___init___(self, value):
    self.value = value
    self.left is None
    self.right is None
    self.parent is None

def ___init___(self, value, left, right, parent):
    """set the parameters to corresponding class members"""
    self.value = value
    self.left = left
    self.right = right
    self.parent = parent

def __init__(self, value, left=None, right=None, parent=None):
    """set the parameters to corresponding class members"""
    self.value = value
    self.left = left
    self.right = right
    self.parent = parent

@Moshe が指摘しているように、関数をオーバーロードできないため、デフォルトの引数を挿入して使用する必要があります。

于 2013-03-18T20:58:54.820 に答える
2

に変更___init___する__init__と修正されます。(2 つのアンダースコア対 3)

于 2013-03-18T20:55:11.073 に答える