Python代码执行报错:'bookNode'对象无'bkID'属性求助
解决Python中AttributeError: 'bookNode' object has no attribute 'bkID'的问题
这个错误的根源很简单——你在代码里搞混了属性名!咱们一步步拆解修复:
1. 定位问题核心
在bookNode类的构造方法里,你把图书ID定义成了self.bookID(注意是大写的O):
class bookNode: def __init__(self, bkID, availCount): self.bookID = bkID # 这里是bookID self.avCntr = availCount # ... 其他属性
但在_readBookList和_print_tree方法里,你却错误地用了bkID(少了大写O)去引用这个属性,比如:
# 错误写法 if bkID < cur_node.bkID:
Python找不到这个bkID属性,自然就抛出了AttributeError。
2. 修正属性引用
把所有错误的cur_node.bkID都改成cur_node.bookID:
修正_readBookList方法
顺便修复一个小bug:原来的elif分支里判断cur_node == None没有意义(cur_node是传入的当前节点,不可能为None),应该判断cur_node.right是否为空:
def _readBookList(self,bkID, availCount, cur_node): if bkID < cur_node.bookID: if cur_node.left == None: cur_node.left = bookNode(bkID, availCount) else: self._readBookList(bkID, availCount, cur_node.left) elif bkID > cur_node.bookID: if cur_node.right == None: # 改成判断right是否为空 cur_node.right = bookNode(bkID,availCount) else: self._readBookList(bkID,availCount, cur_node.right) else: print("ID already in tree!")
修正_print_tree方法
def _print_tree(self, cur_node): if cur_node != None: self._print_tree(cur_node.left) print(cur_node.bookID) # 这里改成bookID self._print_tree(cur_node.right)
3. 额外修复:字符串转整数
从input.txt读取的内容是字符串类型,直接传给bookNode会导致后续整数比较出现潜在问题(比如字符串排序逻辑和整数不一致),所以要把读取到的ID和数量转成整数:
tree = Tree() f = open("input.txt", "r") for x in f: x = x.strip() # 去掉每行末尾的换行符 bookDetails = x.split(",") # 转成整数再传入 tree.readBookList(int(bookDetails[0]), int(bookDetails[1])) f.close() tree.print_tree()
完整修复后的代码
class bookNode: def __init__(self, bkID, availCount): self.bookID = bkID self.avCntr = availCount self.ChkOutCntr = 0 self.left = None self.right = None class Tree: def __init__(self): self.root = None def readBookList(self, bkID, availCount): if self.root == None: self.root = bookNode(bkID, availCount) else: self._readBookList(bkID,availCount,self.root) def _readBookList(self,bkID, availCount, cur_node): if bkID < cur_node.bookID: if cur_node.left == None: cur_node.left = bookNode(bkID, availCount) else: self._readBookList(bkID, availCount, cur_node.left) elif bkID > cur_node.bookID: if cur_node.right == None: cur_node.right = bookNode(bkID,availCount) else: self._readBookList(bkID,availCount, cur_node.right) else: print("ID already in tree!") def print_tree(self): if self.root != None: self._print_tree(self.root) def _print_tree(self, cur_node): if cur_node != None: self._print_tree(cur_node.left) print(cur_node.bookID) self._print_tree(cur_node.right) tree = Tree() f = open("input.txt", "r") for x in f: x = x.strip() bookDetails = x.split(",") tree.readBookList(int(bookDetails[0]), int(bookDetails[1])) f.close() tree.print_tree()
现在运行代码就能正常执行了,会按顺序输出100、101、102。
内容的提问来源于stack exchange,提问作者thunderbolt489
相关产品推荐
相关产品推荐

