CodeKingPlusPlus
CodeKingPlusPlus

Reputation: 16081

Python object instantiation

I am very new to python and need some help with instantiating an object. The python interpreter is giving me trouble when instantiating an object of a class I defined. There are two classes, BTNode and BST (which are stored in files bst_node.py and bst.py respectively):

# 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)

So, in the interpreter I do:

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

and I get an error which says that this constructor takes no arguments

The constructor clearly takes an argument value so what is going wrong here? How can I fix this error?

Thanks, all help is greatly appreciated!

Upvotes: 2

Views: 1578

Answers (3)

Moshe
Moshe

Reputation: 9899

The first issue is that you called your functions ___init___ instead of __init__. All of the 'special methods' use two underscores.

A second issue in this code is that in BTNode you redefined __init__. You can't overload functions in python. When you reclare __init__ you effectively deleted the first constructor.

A third issue is your usage of is. is is an operator that checks whether two objects are exactly the same and returns True or False. In the constructor, you have a few self.left is None is examining the value of self.left (which wasn't declared yet), and examining whether or not it is None. To set it, use = as follows:self.left = None

To fix the second and third issue you should use default argument values. For example:

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

Upvotes: 5

Adam Obeng
Adam Obeng

Reputation: 1542

In addition to the number of underscores problem, you should replace

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

with

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

Because as @Moshe points out, you can't overload functions, you should use default arguments insted.

Upvotes: 4

dm03514
dm03514

Reputation: 55972

Changing ___init___ to __init__ should fix it. (2 underscores vs 3)

Upvotes: 2

Related Questions