单继承+方法返回self是最直接稳定的方式:基类DataChain封装私有数据、提供链式接口并统一返回self;子类实现filter/map等单一职责方法,操作私有属性并返回self;终结方法如to_list()负责最终结果提取与归一化。

用单继承 + 方法返回 self 是最直接、最稳定的方式。不需要多层嵌套或复杂 MRO,重点是让每个处理方法都支持连续调用,同时把核心数据封装在实例内部,避免外部随意修改。
继承结构要简洁:子类只继承一个基础处理器
定义一个基类(比如 DataChain),负责初始化数据、提供通用接口、统一返回 self;所有具体操作(如过滤、映射、去重)都作为子类的方法实现。不建议一上来就用多继承或抽象基类——容易过早复杂化。
- 基类只管“容器”和“链式出口”,不管具体逻辑
- 子类方法不做状态外泄,全部通过
self.data操作内部数据 - 每个方法末尾写
return self,不是return None或新对象
数据必须私有化:用双下划线保护核心属性
把原始数据存为 self.__data,外部无法直接读写;提供公开方法(如 .get() 或 .to_list())按需暴露结果。这样既能防止误改,又保留调试和导出能力。
- 构造时校验输入,比如只接受 list/tuple,自动转成不可变副本(
tuple(data))再存为私有属性 - 所有处理方法(
.filter()、.map()等)只操作self.__data,并更新它 - 不提供
.data这样的公有属性,避免用户绕过逻辑直接赋值
每个处理方法保持单一职责 + 可组合
例如 .filter(func) 只做筛选,.map(func) 只做转换,.limit(n) 只截取前 n 项。它们彼此不耦合,顺序可互换,且都返回 self,天然支持链式写法。
- 方法内不 print、不 raise(除非必要校验失败),不依赖全局变量
- 函数参数尽量用 callable,兼容 lambda、普通函数、甚至带状态的类实例
- 示例:
tool.filter(lambda x: x > 0).map(str).limit(5).get()
加一个“收口”方法用于最终提取结果
链式调用本质是构建过程,最后总得拿到结果。加一个明确的终结方法,比如 .result()、.collect() 或 .to_list(),它不返回 self,而是返回处理后的数据(通常为 list 或 tuple)。
- 这个方法应做一次最终拷贝,避免后续修改影响工具实例
- 可以顺便做类型归一化,比如把 generator 转成 list,把 tuple 转成 list
- 如果需要支持多种输出格式(如 dict、json、pandas DataFrame),可用关键字参数控制,但默认行为要简单明确










