如何在Python列表中以Dog对象的id重命名对象并保留属性
解决方法
首先修改Dog类,添加__repr__方法,让打印列表时能直观看到狗的id等信息,替代默认的内存地址显示:
class Dog: def __init__(self, name, age, breed, id): self.name = name self.age = age self.breed = breed self.id = id def __repr__(self): return f"Dog(id='{self.id}', name='{self.name}', breed='{self.breed}')"
以下提供两种满足你需求的实现方式:
方式一:列表+字典组合(简单直接)
保留原dogs列表用于索引访问,同时新增一个字典映射id到对应Dog对象,实现按id快速定位:
dogs = [] dog_id_map = {} # 存储id到Dog对象的映射 intake = input("Enter the number of dogs to intake:") for i in range(int(intake)): name = input("Name of dog: ") age = input("Age of dog: ") breed = input("Breed of dog: ") dog_id = input("Dog ID: ") new_dog = Dog(name, age, breed, dog_id) dogs.append(new_dog) dog_id_map[dog_id] = new_dog # 将新对象加入映射字典
使用示例:
# 通过索引修改对象属性 dogs[0].age = 3 # 通过id访问对象并修改属性 dog_id_map['dog001'].name = "Buddy" # 打印列表,显示自定义格式 print(dogs) # 输出示例:[Dog(id='dog001', name='Buddy', breed='Labrador'), Dog(id='dog002', name='Max', breed='Poodle')] # 通过id直接获取对象 print(dog_id_map['dog001'])
方式二:自定义混合类(统一结构)
如果想要一个同时支持索引和id访问的单一结构,可以自定义继承自list的类,内部维护id映射:
class DogList(list): def __init__(self): super().__init__() self.id_map = {} def add_dog(self, dog): self.append(dog) self.id_map[dog.id] = dog def get_by_id(self, dog_id): return self.id_map.get(dog_id, None) # 可选:支持直接用[]传入id获取对象 def __getitem__(self, key): if isinstance(key, str): return self.id_map.get(key) return super().__getitem__(key)
使用示例:
dog_list = DogList() intake = input("Enter the number of dogs to intake:") for i in range(int(intake)): name = input("Name of dog: ") age = input("Age of dog: ") breed = input("Breed of dog: ") dog_id = input("Dog ID: ") new_dog = Dog(name, age, breed, dog_id) dog_list.add_dog(new_dog)
访问与修改:
# 通过索引访问修改 dog_list[0].age = 4 # 通过id访问修改(两种方式) dog_list.get_by_id('dog001').name = "Charlie" # 或者直接用[]传入id dog_list['dog001'].breed = "Golden Retriever" # 打印列表 print(dog_list)
两种方式都能保留列表的索引修改能力,同时支持通过狗的id快速访问对象,且修改对象属性时所有引用都会同步更新(因为指向的是同一个实例)。
内容的提问来源于stack exchange,提问作者Alex Rapino
相关产品推荐
相关产品推荐

