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

Python子类重写fit后调用super.fit_transform触发无限循环问题求解

问题判断结论

你的判断完全正确,这段代码会触发无限递归,最终抛出RecursionError。

原因说明

Python的实例方法调用遵循动态派发规则:当你调用super().fit_transform(X, y)时,确实会执行父类A的fit_transform实现,但方法内部的self始终是B类的实例,因此self.fit(X, y)会优先调用B类重写的fit方法,最终形成循环调用链路:

B.fit() → A.fit_transform() → B.fit() → A.fit_transform() → ...

规避方案

你要求B类中调用对应方法的返回值和纯A类实例调用fit_transform的结果完全一致,推荐以下两种方案,不需要修改父类A的代码:

方案1:显式调用A类的方法实现(最稳妥)

直接指定使用A类的fit和transform实现,绕开动态派发逻辑,完全等价于纯A实例调用fit_transform的效果:

class B(A):
  def fit(self, X, y):
    # 显式调用A类的fit,把当前实例作为self传入
    A.fit(self, X, y)
    # 显式调用A类的transform,得到和A实例调用完全一致的结果
    transformed_X = A.transform(self, X)
    # 后续你自己的逻辑
    ...

方案2:直接调用A类的fit_transform实现

如果你不想拆分fit和transform调用,也可以直接显式调用A类的fit_transform:

class B(A):
  def fit(self, X, y):
    transformed_X = A.fit_transform(self, X, y)
    # 后续你自己的逻辑
    ...

两种方案的运行结果完全一致,都能避免无限递归,且返回值和纯A实例调用fit_transform的结果没有差异。

内容的提问来源于stack exchange,提问作者tossimmar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:15:04