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会自动使用这个方法的返回值来打印对象。
- 给
Name类添加__str__方法,返回完整姓名:
class Name: def __init__(self, first, last): self.first = first self.last = last def __str__(self): return f"{self.first} {self.last}"
- 给
Pet类添加__str__方法,返回宠物的姓名:
class Pet: def __init__(self, name, owner): self.name = name self.owner = owner def __str__(self): return str(self.name)
- 修改
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
相关产品推荐
相关产品推荐

