Python OOP场景下Song类how_many方法传入的listener多列表拆分问题
解决方案
无需修改外部的how_many调用代码,只需调整Song类的内部实现,通过实例属性存储历史调用数据即可实现列表拆分,以下是两种常见场景的实现:
场景1:拆分保留每次调用的独立列表
如果需要单独获取每次调用传入的列表,可新增实例属性存储所有历史调用的参数:
class Song: def __init__(self, title, artist): self.title = title self.artist = artist # 实例属性存储每次调用的listener列表,互相独立 self.call_history = [] def how_many(self, listener): # 存入当前次的列表 self.call_history.append(listener) # 直接操作当前次的listener即可,不会和其他次调用混淆 print(f"当前次传入的列表:{listener}") # 如需获取历史某次的列表,可直接通过索引读取:self.call_history[0] 为第一次调用的列表 obj_1 = Song("Mount Moose", "The Snazzy Moose") obj_1.how_many(['John', 'Fred', 'Bob', 'Carl', 'RyAn']) obj_1.how_many(['Luke', 'AmAndA', 'JoHn'])
如果你之前出现每次调用都能拿到所有历史列表的情况,通常是因为误用了类属性或者可变默认参数存储中间结果,改为在__init__中定义实例属性存储即可解决。
场景2:统计每次新增的听众数(大小写不敏感)
结合how_many方法的常用业务需求,可通过集合实现大小写不敏感的历史听众去重,统计每次调用的新增人数:
class Song: def __init__(self, title, artist): self.title = title self.artist = artist # 存储历史已出现的听众,统一转小写实现大小写不敏感匹配 self.exist_listeners = set() def how_many(self, listener): # 处理当前次的列表,转小写后去重 current_listeners = {name.lower() for name in listener} # 筛选当前次的新增听众 new_listeners = current_listeners - self.exist_listeners # 更新历史听众集合 self.exist_listeners.update(new_listeners) # 返回/打印新增人数 print(f"本次新增听众数:{len(new_listeners)}") return len(new_listeners) obj_1 = Song("Mount Moose", "The Snazzy Moose") obj_1.how_many(['John', 'Fred', 'Bob', 'Carl', 'RyAn']) # 输出5 obj_1.how_many(['Luke', 'AmAndA', 'JoHn']) # 输出2(John已存在)
内容的提问来源于stack exchange,提问作者NewCoder
相关产品推荐
相关产品推荐

