Python类修改问题:创建Pet实例时自动加入Owner的宠物列表
问题解决:让Pet实例自动加入对应Owner的pets列表
问题描述
当前代码运行后两次输出1,但期望先输出2、再输出1。需求是创建Pet实例时,该实例自动添加到对应Owner的pets列表中,仅允许修改类的代码部分。之前尝试在Owner类的__init__方法中添加self.pets.append(Pet(self, Owner).name),逻辑错误,无法定位问题原因。
原问题代码
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 = [] # 错误的修改代码 self.pets.append(Pet(self, Owner).name) # 期望输出: # 2 # 1 owner_1 = Owner(Name("David", "Joyner")) 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) print(len(owner_1.pets)) print(len(owner_2.pets))
错误原因分析
- 在Owner的
__init__里手动创建Pet实例并添加到pets列表,导致每个Owner初始化时就自带一个Pet,和手动创建的Pet重复计数,最终结果错误。 - 创建Pet时传入的
Owner是类本身,不是具体的Owner实例,参数完全错误,还会导致Pet的owner属性异常。
正确修改方案
无需修改Owner类,只需要在Pet的构造方法中添加逻辑,将当前创建的Pet实例自动加入到传入的Owner的pets列表中。
修改后的代码
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 # 核心修改:把当前Pet实例添加到对应Owner的pets列表 owner.pets.append(self) class Owner: def __init__(self, name): self.name = name self.pets = [] # 测试代码保持不变 owner_1 = Owner(Name("David", "Joyner")) 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) print(len(owner_1.pets)) print(len(owner_2.pets))
修改说明
- 在Pet的
__init__方法中,接收owner参数后,直接调用owner.pets.append(self),将当前创建的Pet实例加入到该Owner的pets列表中,实现自动关联。 - 删除Owner类中错误的
self.pets.append(Pet(self, Owner).name)代码,避免初始化Owner时错误添加无关Pet。
运行修改后的代码,会输出:
2 1
完全符合预期。
内容的提问来源于stack exchange,提问作者Mac Jacobs
相关产品推荐
相关产品推荐

