Python访问类中列表返回对象地址而非内容的解决方法
问题根因
- 你在格式化字符串时直接传入
a_owner.pets,此时传入的是列表对象本身,输出的是列表的默认字符串表示(类似["大黄", "橘猫"]的格式),并非你预期的拼接好的可读内容。 - 你尝试的
a_owner.pets.name是错误写法:pets是list类型的容器,本身不存在name属性,自然无法访问到预期内容,列表里存储的元素需要从容器内部取出后才能访问对应属性。
修复方法
根据你pets列表存储的内容类型,分两种场景处理:
- 如果列表里直接存的是宠物名的字符串值,用字符串的
join方法把列表元素拼接成连贯的字符串即可 - 如果列表里存的是自定义的宠物类实例,需要先遍历列表取出每个实例,再访问实例的属性后拼接
场景1:pets存储字符串类型的宠物名
class Owner: def __init__(self, name): self.name = name self.pets = [] def get_pets_string(a_owner): # 空列表时做兜底处理,避免join报错 pets_content = ", ".join(a_owner.pets) if a_owner.pets else "暂无登记宠物" result = "{0} {1}'s pets are: {2}.".format(a_owner.name.first, a_owner.name.last, pets_content) return result
场景2:pets存储自定义宠物类实例
假设你的宠物类结构如下,每个实例有name属性存储宠物名:
class Pet: def __init__(self, name, pet_type): self.name = name self.pet_type = pet_type
对应修改get_pets_string函数,遍历列表取出每个宠物实例的名称再拼接:
def get_pets_string(a_owner): # 列表推导式遍历所有宠物实例,取出name属性 pet_name_list = [pet.name for pet in a_owner.pets] pets_content = ", ".join(pet_name_list) if pet_name_list else "暂无登记宠物" result = "{0} {1}'s pets are: {2}.".format(a_owner.name.first, a_owner.name.last, pets_content) return result
注意:列表是存储多个元素的容器,访问容器内的内容必须通过遍历、索引取值的方式先拿到单个元素,再对元素做属性访问或者值读取,不能直接对列表容器本身调用元素才有的属性。
内容的提问来源于stack exchange,提问作者gigilynne
相关产品推荐
相关产品推荐

