2013-03-18 3 views
2

저는 파이썬에 매우 익숙하며 객체를 인스턴스화하는 데 도움이 필요합니다. 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) 

인터프리터에서 내가 할, 그래서 : (각각 파일 bst_node.pybst.py에 저장됩니다) 두 개의 클래스, BTNodeBST이 있습니다

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

및 I 그 말을하는 오류가 발생합니다. constructor takes no arguments

생성자는 분명히 인수 value을 취해서 여기서 무엇이 잘못 될까요? 이 오류를 수정하려면 어떻게해야합니까?

감사합니다. 모든 도움을 주시면 대단히 감사하겠습니다.

+2

당신의 질문은 아니지만,'is'가 비교 되었기 때문에'self.left is none'과 같은 줄에 문제가 생기지 않는다면'True' 또는'False'가 될 것입니다. 대신에'self.left = None'을 사용하십시오. – askewchan

답변

4

이 문제는, 당신은

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 

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 

교체해야 @Moshe가 지적한대로, 당신은 할 수 없기 때문에 오버로드 함수를 사용하려면 insted라는 기본 인수를 사용해야합니다.

2

___init___에서 __init__으로 변경해야합니다. (밑줄 2와 3)

5

첫 번째 문제는 대신에 ___init___ 기능을 호출했다는 것입니다. 모든 '특별한 방법'은 두 개의 밑줄을 사용합니다.

이 코드의 두 번째 문제점은 BTNode__init__을 다시 정의한 것입니다. 파이썬에서 함수를 오버로드 할 수 없습니다. __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):