[英]Python inheritance issue : AttributeError: 'AVL_Tree' object has no attribute 'score'
[英]AVL tree: Python inheritance issue
我有树类:BinarySearchTree,TreeNode和AVLTree。
TreeNode类用于BinarySearchTree类。 AVLTree继承BinarySearchTree。请参见下面的代码:
from Tnode import TreeNode
class BinarySearchTree:
def __init__(self):
self.root = None
self.size = 0
树节点类如下所示:
class TreeNode:
def __init__(self,key,val,left=None,right=None,parent=None):
self.key = key
self.payload = val
self.leftChild = left
self.rightChild = right
self.parent = parent
AVLTree类:
from Tnode import TreeNode
from binstree import BinarySearchTree
class AVLTree(BinarySearchTree):
def __init__(self,key,val,left=None,right=None,parent=None,balanceFactor=0):
TreeNode.__init__(self,key,val,left,right,parent)
self.balanceFactor = balanceFactor
self.root = None
self.size = 0
每当我运行AVLTree类时,都会出现以下错误: AttributeError: TreeNode instance has no attribute 'balanceFactor'
我在做什么错了?可以在这里查看代码: http : //interactivepython.org/runestone/static/pythonds/Trees/AVLTreeImplementation.html
http://interactivepython.org/runestone/static/pythonds/Trees/SearchTreeImplementation.html
我不能完全确定我是否完全理解您的代码,但是在我看来,您的问题(或至少您的问题之一)在此行TreeNode.__init__(self,key,val,left,right,parent)
。
我敢打赌,您不想传递self
参数,因为它的类型为AVLTree
,并且解释程序期望使用TreeNode
类型。 现在,我认为您可能想在AVLTree
构造函数中做的就是简单地创建一个TreeNode
对象作为您的AVL根节点。 要在Python中创建类的实例,您无需显式调用__init__
方法。 您可以简单地执行class_instance = Class(parameters)
,或者在这种情况下, self.root = TreeNode(key, val, left, right, parent)
。
因此,我们可以将您发布的内容变成这样:(我只会显示我所做的更改,其余课程对我来说似乎还不错)
class AVLTree(BinarySearchTree):
def __init__(self, key, val, left=None, right=None, parent=None, balancefactor=0):
self.balanceFactor = balancefactor
self.root = TreeNode(key, val, left, right, parent)
self.size = 1
我们正在使用传递给树构造函数的信息来创建根节点并更新树的大小。 您可以创建一个带有根节点的简单AVL树,而不会出现主要问题:
if __name__ == '__main__':
avl = AVLTree("key", "val")
看完您要处理的文字后,我想我发现您感到困惑了。 从BinarySearchTree
到AVLTree
类的更改要求还使用新的balanceFactor
属性更新TreeNode
类(或者可能创建新的AVLTreeNode
类)。 文本中从未对此进行具体描述,因此您已开始在不合适的地方将节点需要的新内容合并到Tree
类中。
而是将balanceFactor
内容放入适当的Node
类中:
class AVLTreeNode(TreeNode):
def __init__(self,key,val,left=None,right=None,parent=None,balanceFactor=0):
TreeNode.__init__(self,key,val,left,right,parent)
self.balanceFactor = balanceFactor
现在,您的AVLTree
代码只需要创建AVLTreeNode
对象而不是TreeNode
对象,并且它将在需要时找到适当的balanceFactor
属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.