Python类属性打印异常:返回对象内存地址而非属性值求助
解决Python对象打印显示内存地址的问题
嘿,我一眼就看出问题出在哪啦!你看到的<__main__.Person object at 0x1055f5d68>是Python默认的对象字符串表示,核心原因是你的Person类没有定义自定义的__str__或__repr__方法,所以当你在Book类里调用str(self.person)时,Python只能输出对象的内存地址,而不是你想要的人员信息。
咱们一步步来解决这个问题:
1. 给Person类添加自定义的字符串表示方法
你需要在Person类里定义__str__方法(或者__repr__,前者面向普通用户的可读输出,后者偏向开发者的调试输出),让Python知道怎么把Person对象转换成有意义的字符串。比如:
class Person: def __init__(self, name): self.name = name # 假设Person类有name属性,可替换为你实际使用的属性 # 定义__str__返回人员的可读信息 def __str__(self): return self.name # 直接返回姓名,也可以写成"借阅人: {self.name}"这种格式
这样当你调用str(person)时,就会返回这个人的姓名,而不是冷冰冰的内存地址了。
2. 修复Book类__str__方法的隐藏bug
看你的Book类__str__代码,还有个小问题:else分支里的result变量没有初始化就直接执行result += str(person),运行时会抛出UnboundLocalError。咱们把它修复得更健壮、更易读:
class Book: def __init__(self, title): self.title = title self.person = None self.waitlist = [] def __str__(self): if self.person is not None: # 用f-string让输出更清晰,带上书名信息 result = f"《{self.title}》当前借阅人: {str(self.person)}" else: result = f"《{self.title}》等待列表: " # 用join方法高效拼接等待列表的人员,同时处理空列表的情况 if self.waitlist: result += ", ".join(str(p) for p in self.waitlist) else: result += "无" return result def borrow(self, person): if self.person is None: self.person = person return self.__str__() else: self.waitlist.append(person) return self.__str__()
3. 测试验证效果
现在咱们写个小测试看看效果:
# 创建Person实例 alice = Person("Alice") bob = Person("Bob") charlie = Person("Charlie") # 创建Book实例 python_book = Book("Python从入门到精通") # 第一次借阅 print(python_book.borrow(alice)) # 输出:《Python从入门到精通》当前借阅人: Alice # 第二次、第三次借阅,加入等待列表 print(python_book.borrow(bob)) # 输出:《Python从入门到精通》等待列表: Bob print(python_book.borrow(charlie)) # 输出:《Python从入门到精通》等待列表: Bob, Charlie
这样就能完美解决你遇到的问题啦,再也看不到那些恼人的内存地址了!
内容的提问来源于stack exchange,提问作者Sarina
相关产品推荐
相关产品推荐

