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
相关产品推荐
相关产品推荐

