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

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))

错误原因分析

  1. 在Owner的__init__里手动创建Pet实例并添加到pets列表,导致每个Owner初始化时就自带一个Pet,和手动创建的Pet重复计数,最终结果错误。
  2. 创建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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 00:15:35