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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 02:45:04