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

Python中从类调用列表显示对象地址而非内容的问题解决

Python打印Pet对象列表显示内存地址而非名称的解决办法

问题描述

从Owner类调用self.pets列表时,输出的是Pet对象的内存地址信息,而非预期的宠物名称:

当前输出:

David Friend's pets are: [<__main__.Pet object at 0x7f547c620128>, <__main__.Pet object at 0x7f547c620198>]
Audrey Hepburn's pets are: [<__main__.Pet object at 0x7f547c620208>]

预期输出:

David Friend's pets are: Boggle Joyner, Artemis Joyner
Audrey Hepburn's pets are: Pippin Hepburn

原代码如下:

class Name:
    def __init__(self, first, last):
        self.first = first
        self.last = last

class Pet:
    def __init__(self, name, owner):
        self.name = name
        self.owner = owner
        
class Owner:
    def __init__(self, name):
        self.name = name
        self.pets = []

def get_pets_string(an_owner):
    return str(an_owner.name.first) + " " + str(an_owner.name.last) + "'s pets are: " + str(an_owner.pets)


owner_1 = Owner(Name("David", "Friend"))
owner_2 = Owner(Name("Audrey", "Hepburn"))

pet_1 = Pet(Name("Boggle", "Joyner"), owner_1)
pet_2 = Pet(Name("Artemis", "Joyner"), owner_1)
pet_3 = Pet(Name("Pippin", "Hepburn"), owner_2)

owner_1.pets.append(pet_1)
owner_1.pets.append(pet_2)
owner_2.pets.append(pet_3)

print(owner_2.name.first)
print(get_pets_string(owner_1))
print(get_pets_string(owner_2))

原因分析

Python默认打印对象时,会输出对象的类名和内存地址,这是因为没有为Pet和Name类定义自定义的字符串表示方法。

解决方法

方法一:为类添加__str__方法

__str__方法用于定义对象被转换为字符串时的显示内容,添加后Python会自动使用这个方法的返回值来打印对象。

  1. 给Name类添加__str__方法,返回完整姓名:
class Name:
    def __init__(self, first, last):
        self.first = first
        self.last = last
    
    def __str__(self):
        return f"{self.first} {self.last}"
  1. 给Pet类添加__str__方法,返回宠物的姓名:
class Pet:
    def __init__(self, name, owner):
        self.name = name
        self.owner = owner
    
    def __str__(self):
        return str(self.name)
  1. 修改get_pets_string函数,将宠物列表转换为逗号分隔的字符串:
def get_pets_string(an_owner):
    pets_str = ", ".join(str(pet) for pet in an_owner.pets)
    return f"{an_owner.name.first} {an_owner.name.last}'s pets are: {pets_str}"

方法二:直接在函数中处理宠物名称(无需修改类)

如果不想修改原有类的结构,可以直接在get_pets_string函数里遍历宠物列表,提取每个宠物的姓名并拼接:

def get_pets_string(an_owner):
    pets_str = ", ".join(f"{pet.name.first} {pet.name.last}" for pet in an_owner.pets)
    return f"{an_owner.name.first} {an_owner.name.last}'s pets are: {pets_str}"

修改后的完整代码(方法一版本)

class Name:
    def __init__(self, first, last):
        self.first = first
        self.last = last
    
    def __str__(self):
        return f"{self.first} {self.last}"

class Pet:
    def __init__(self, name, owner):
        self.name = name
        self.owner = owner
    
    def __str__(self):
        return str(self.name)
        
class Owner:
    def __init__(self, name):
        self.name = name
        self.pets = []

def get_pets_string(an_owner):
    pets_str = ", ".join(str(pet) for pet in an_owner.pets)
    return f"{an_owner.name.first} {an_owner.name.last}'s pets are: {pets_str}"


owner_1 = Owner(Name("David", "Friend"))
owner_2 = Owner(Name("Audrey", "Hepburn"))

pet_1 = Pet(Name("Boggle", "Joyner"), owner_1)
pet_2 = Pet(Name("Artemis", "Joyner"), owner_1)
pet_3 = Pet(Name("Pippin", "Hepburn"), owner_2)

owner_1.pets.append(pet_1)
owner_1.pets.append(pet_2)
owner_2.pets.append(pet_3)

print(owner_2.name.first)
print(get_pets_string(owner_1))
print(get_pets_string(owner_2))

运行上述代码后,就能得到预期的输出结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 09:40:25