2

我对 python 很陌生,需要一些帮助来实例化一个对象。在实例化我定义的类的对象时,python 解释器给我带来了麻烦。有两个类,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__. 所有的“特殊方法”都使用两个下划线。

此代码中的第二个问题是BTNode您重新定义了__init__. 你不能在 python 中重载函数。当您重新声明时,__init__您实际上删除了第一个构造函数。

第三个问题是您对is. is是一个运算符,用于检查两个对象是否完全相同并返回Trueor False。在构造函数中,您有一些self.left is None正在检查self.left(尚未声明的)的值,并检查它是否为None. 要设置它,请=按如下方式使用:self.left = None

要解决第二个和第三个问题,您应该使用默认参数值。例如:

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 回答