如何解决Python中的AttributeError:type object 'LibraryItem'无'Book_Title'属性?
问题解答
错误原因
出现AttributeError: type object 'LibraryItem' has no attribute '__Title'(注:你提供的错误提示与代码实际问题略有偏差),核心原因有两点:
- 私有属性的名称修饰机制:Python中以双下划线
__开头的属性属于私有属性,解释器会自动对其进行名称修饰,将__Title转换为_LibraryItem__Title,以此防止派生类直接访问原名称。 - 错误的访问方式:你在
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
相关产品推荐
相关产品推荐

