Python 参数数无效(TypeError),但给出了精确的参数
我试图创建一个二进制搜索树,但它给了我一个Python 参数数无效(TypeError),但给出了精确的参数,python,oop,binary-search-tree,Python,Oop,Binary Search Tree,我试图创建一个二进制搜索树,但它给了我一个TypeError。如何将第二个参数(node)作为对象本身传递给insert(),因为第一个参数(self)始终是BSTNode的实例 # Binary Search Tree # Create a BST and insert elements and print Inorder traversal class BSTNode(object): def __init__(self, key, left=None, right=None):
TypeError
。如何将第二个参数(node
)作为对象本身传递给insert()
,因为第一个参数(self
)始终是BSTNode
的实例
# 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()
函数创建@property
(在本例中,也不应该为inoorder()
创建属性)
属性应用于管理具有getter、setter和deleter的类的属性。getter
(使用@属性创建的
装饰,并在通过bst.insert
访问属性时调用)必须使用单个参数self
。然后,它(通常)返回分配给它的属性
相反,像使用普通的方法一样使用它
并添加元素而不修饰它,请注意我如何将self
添加到您的insert()
调用中:
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
def插入(自身、节点、键):
如果节点为无:
返回节点(键)
elif keynode.key:
node.right=self.insert(node.right,键)
返回节点
现在插入工作正常,并返回新的节点对象:
bst.insert(root, 30)
# returns <__main__.BSTNode at 0x7fd9f74a8668>
bst.insert(根,30)
#返回
发生这种情况的原因是,属性的(\uuuuuu get\uuuuu
)函数在内部调用函数(insert
),该函数被修饰为getter,但只有一个参数insert(instanceOfClass)
因为您已经用多个参数定义了函数insert()
,所以当进行此调用时,您将得到一个很好的TypeError
@rohit varshney
原因:属性装饰器有3个输入参数(fget、fset、fdel)、文档字符串
此处的属性装饰器用法不正确,因此出现错误
修复:请删除insert def上面的@property
装饰师教程:
你认为@property
到底是做什么的?您根本没有正确使用它。只需删除@属性
装饰程序即可。属性是一个声明为getter的函数,它接受一个参数:self
,并返回属性的值。优点是能够调用val=obj.prop
而不是val=obj.prop()
,从而掩盖了属性是计算而不是固定值的事实。除了不正确的@property
用法之外,python中的方法调用还需要self
前缀。使用self.insert()。
bst.insert(root, 30)
# returns <__main__.BSTNode at 0x7fd9f74a8668>