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
相关产品推荐
相关产品推荐

