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

Python如何在AddressBook类的contact_by_name方法返回对应Contact实例

Python面向对象通讯录方法修改方案

核心问题定位

你当前写的contact_by_name方法每次调用都会创建全新的Contact实例,没有从AddressBook已存储的self.contacts列表中匹配查询,因此自然无法返回已有的实例,也不可能满足==的判断条件。
另外现有代码还存在两处潜在bug需要同步修复:

  • Contact类的手机号、邮箱字段默认值设为False不符合业务要求,业务要求支持存储0个或多个,应该默认设为空列表;且姓名为必填项,不应该设置None默认值
  • AddressBook的初始化参数用了可变默认值contacts = [],属于Python常见陷阱,多个AddressBook实例会共享同一个联系人列表,导致数据串扰

修改后的代码

class Contact:
    # 姓名设为必填参数,手机号、邮箱默认是空列表
    def __init__(self, name, phone_numbers=None, email_addresses=None):
        self.name = name
        self.phone_numbers = phone_numbers if phone_numbers is not None else []
        self.email_addresses = email_addresses if email_addresses is not None else []
    
    # 可选:如果要让==判断比较实例的内容而非内存地址,可以加这个魔法方法
    def __eq__(self, other):
        if not isinstance(other, Contact):
            return False
        return self.name == other.name and self.phone_numbers == other.phone_numbers and self.email_addresses == other.email_addresses

class AddressBook:
    # 修复可变默认参数坑,用None作为默认值
    def __init__(self, contacts=None):
        self.contacts = contacts if contacts is not None else []
    
    def add_contact(self, new_contact):
        self.contacts.append(new_contact)
    
    def contact_by_name(self, person):
        # 遍历已存储的联系人列表,匹配姓名后返回对应实例
        for contact in self.contacts:
            if contact.name == person:
                return contact
        # 没找到对应联系人可以根据业务需求返回None或者抛出异常
        return None

效果验证

用你给出的测试用例执行:

julian = Contact(name="Julian Berman")
book = AddressBook(contacts=[julian])
print(book.contact_by_name("Julian Berman") == julian)
# 输出结果为True

如果没有给Contact加__eq__方法,也可以用身份判断is验证返回的是同一个实例:

print(book.contact_by_name("Julian Berman") is julian)
# 同样输出True

内容的提问来源于stack exchange,提问作者DJ-coding

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 19:06:04