2015-11-11 41 views
2

我正在嘗試創建一個二叉搜索樹,但它給了我一個TypeError。我如何將第二個參數(node)作爲對象本身傳遞給insert(),因爲第一個參數(self)始終是BSTNode的實例。無效的參數數量(TypeError),儘管給出的確切參數

# Binary Search Tree 
# Create a BST and insert elements and print Inorder traversal 


class BSTNode(object): 
    def __init__(self, key, left=None, right=None): 
     self.left = left 
     self.right = right 
     self.key = key 

    @property 
    def insert(self, node, key): 
     if node is None: 
      return BSTNode(key) 
     elif key < node.key: 
      node.left = insert(node.left, key) 
     elif key > node.key: 
      node.right = insert(node.right, key) 
     return node 

    @property 
    def inorder(root): 
     if root: 
      inorder(root.left) 
      print(root.key) 
      inorder(root.right) 

if __name__ == "__main__": 
    bst = BSTNode(50) 
    bst.insert(bst, 30) 
    bst.insert(bst, 20) 
    bst.insert(bst, 40) 
    bst.insert(bst, 70) 
    bst.insert(bst, 60) 
    bst.insert(bst, 80) 

    inorder(root) 

的我多少參數傳遞給insert()沒關係,上面的代碼給出了同樣的錯誤:

Traceback (most recent call last): 
    File "bst.py", line 31, in <module> 
    bst.insert(root, 30) 
TypeError: insert() takes exactly 3 arguments (1 given) 
+4

這是什麼,到底,你認爲'@ property'呢?你根本沒有正確使用它。 – jonrsharpe

+1

只要刪除'@ property'修飾符。屬性是一個聲明爲getter的函數,它接受一個參數:'self'並返回屬性的值。好處是能夠調用'val = obj.prop'而不是'val = obj.prop()',因此掩蓋了屬性被計算而不是固定值的事實。 – Cilyan

+1

在不正確的'@ property'用法之上,python中的方法調用需要'self'前綴。使用'self.insert()'和'self.inorder()'。 –

回答

2

insert()功能,則不應創建@property這裏(既不是inorder()在這個案例)。

應該使用屬性來管理具有getter設置者和刪除者的類的屬性。 getter(您使用@property裝飾創建並在通過bst.insert訪問屬性時調用)必須採用單個參數self。然後,它(通常)返回分配給它的屬性。

相反,使用它像一個普通的method,並添加元素,而裝飾它,請注意我如何添加selfinsert()電話:

def insert(self, node, key): 
    if node is None: 
     return BSTNode(key) 
    elif key < node.key: 
     node.left = self.insert(node.left, key) 
    elif key > node.key: 
     node.right = self.insert(node.right, key) 
    return node 

現在您插入工作得很好,並返回新節點的對象:

bst.insert(root, 30) 
# returns <__main__.BSTNode at 0x7fd9f74a8668> 

出現這種情況的原因是因爲一個適當的(__get__)功能ty內部調用您作爲getter裝飾的函數(insert),但使用單個參數insert(instanceOfClass)

因爲您定義了具有多個參數的函數insert(),所以在調用此函數時,您會得到一個很好的TypeError

0

@rohit varshney

原因:房產裝飾有3input ARGS(fget,FSET,FDEL),文檔字符串。

屬性修飾器的用法在這裏是不合適的,因此也是錯誤。

修復:請刪除上面的@property插入def。

教程上的裝飾: https://dzone.com/articles/python-201-decorators