链式调用的本质是每个方法返回 self;需统一设计初始化、确保幂等性、避免命名冲突,并在有副作用或需明确返回值时主动断开链条。

Python 中实现链式调用,核心就一条:每个想参与链式的方法必须 return self,而不是默认的 None。一旦某个方法返回了别的值(比如计算结果、True、新对象),链条就断了。常见错误是忘了写 return self,或者在中间加了 print() 后顺手写了 return None。
注意:返回 self 不等于“修改原对象”,它只是让调用者能继续用同一个实例调用下一个方法。所有状态变更需显式写入实例属性(如 self._value)。
初始化时最好也支持链式入口,比如允许 MyClass().set_x(1).set_y(2).run()。这就要求 __init__ 不做阻塞操作,且后续方法不依赖未初始化的属性。
__init__ 里只做必要赋值,避免 I/O 或耗时逻辑set_name() 总是替换,不是追加)raise ValueError),而不是静默返回 self —— 否则错误会被掩盖别把链式方法命名为 copy、items、get 这类常见名字,除非你真打算替代其语义。否则用户会困惑:这个 get() 是返回值,还是返回 self?更糟的是,某些库(如 dataclasses 或 ORM)可能依赖这些名字做反射,导致意外行为。
推荐命名风格:with_*(如 with_timeout())、set_*、use_*、enable_* —— 一看就知道是配置型操作,理应返回 self。
链式调用适合构建器(Builder)、配置流、查询 DSL 等场景;但它会让调试变难:无法在中间步骤设断点,堆栈里也看不出哪一环出的问题。以下情况建议放弃:
send_email()、commit_db())—— 用户可能误以为可以连着调用多次filter() 应返回新列表,不是 self)真正难的不是写 return self,而是判断哪些方法该加入链条、哪些该及时“断开”并交出控制权。