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

如何解决Python中的AttributeError:type object 'LibraryItem'无'Book_Title'属性?

问题解答

错误原因

出现AttributeError: type object 'LibraryItem' has no attribute '__Title'(注:你提供的错误提示与代码实际问题略有偏差),核心原因有两点:

  1. 私有属性的名称修饰机制:Python中以双下划线__开头的属性属于私有属性,解释器会自动对其进行名称修饰,将__Title转换为_LibraryItem__Title,以此防止派生类直接访问原名称。
  2. 错误的访问方式:你在Book类的PrintDetails方法中,用LibraryItem.__Title试图访问类属性,但__Title是实例属性,且原名称已被修饰,自然无法找到。

基类属性能否在派生类方法中访问?

分三种情况:

  • 公共属性(无下划线开头):比如self.title,派生类可以直接通过实例self访问。
  • 保护属性(单下划线开头):比如self._Title,按照Python惯例属于保护属性,派生类可以访问,但不建议随意修改,这是一种约定俗成的代码规范。
  • 私有属性(双下划线开头):不能直接用原名称访问,但有两种间接方式:
    • 通过基类提供的公共方法获取(推荐):比如在LibraryItem中添加GetTitle方法返回self.__Title。
    • 使用Python名称修饰后的名字访问(不推荐,破坏封装性):比如self._LibraryItem__Title。

修复后的代码示例

import datetime

class LibraryItem:
    def __init__(self,t,a,i):
        self.__Title = t
        self.__Author = a
        self.__ItemID = i
        self.__OnLoan = False
        self.__DueDate = datetime.date.today()  # 修正原代码拼写错误:DuteDate → DueDate

    def SetOnLoan(self,o):
        self.__OnLoan = o
    def SetDueDate(self,d):
        self.__DueDate = d
    # 添加获取私有属性的公共方法
    def GetTitle(self):
        return self.__Title

class Book(LibraryItem):
    def __init__(self,t,a,i):
        LibraryItem.__init__(self,t,a,i)
        self.__RequestedBy = 'people'

    def SetRequestedBy(self,r):
        self.__RequestedBy = r

    def GetRequestedBy(self):
        return self.__RequestedBy

    def PrintDetails(self):
        # 通过基类提供的方法访问私有属性
        print(self.GetTitle())

ThisBook = Book('Python','Tom','123')
ThisBook.PrintDetails()

内容的提问来源于stack exchange,提问作者Pius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 10:42:50