2013-03-18 2 views
2

Я очень новичок в python и нуждаюсь в некоторой помощи при создании экземпляра объекта. Интерпретатор python создает проблемы при создании объекта класса I. Есть два класса, BTNode и BST (которые хранятся в файлах bst_node.py и bst.py соответственно):Создание экземпляра объекта Python

# 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, так что здесь происходит неправильно? Как я могу исправить эту ошибку?

Спасибо, вся помощь очень ценится!

+2

Не ваш вопрос, но если я ошибаюсь, у вас возникнет проблема с такими строками, как 'self.left is none', потому что' is' сравнивается и будет либо 'True', либо' False'. Вместо этого используйте 'self.left = None'. – askewchan

ответ

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 указывает, вы не можете функции перегрузки, вы должны использовать аргументы по умолчанию.

2

Изменение ___init___ до __init__ должно исправить это. (2 символа подчеркивания против 3)

5

Первая проблема заключается в том, что вы вызывали свои функции ___init___ вместо __init__. Все «специальные методы» используют два символа подчеркивания.

Вторая проблема в этом коде заключается в том, что в BTNode вы переопределили __init__. Вы не можете перегружать функции в python. Когда вы возвращаете __init__, вы фактически удаляете первый конструктор.

Третья проблема заключается в использовании вами is. is - это оператор, который проверяет, являются ли два объекта одинаковыми и возвращает True или False. В конструкторе у вас есть несколько self.left is None, изучая значение self.left (которое еще не было объявлено) и изучает, является ли оно None. Чтобы установить его, используйте = следующим образом: self.left = None

Чтобы исправить вторую и третью проблему, вы должны использовать default argument values. Например:

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

Смежные вопросы