You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 12:42:34