【发布时间】:2020-05-16 15:36:08
【问题描述】:
我已经给了一个类A,方法是f和g。在A.f的实现中,调用了self.g方法,即使用了A.g。 (我无法/愿意更改此类 A,因为它来自 python 包。)
现在我想建立一个A 的子类B 并想覆盖f 和g 方法。在B.f的实现中,我调用super().f,即使用A.f。在B.g.的实现中,我调用self.f,即使用B.f。
我希望一切都定义明确:
B.g 致电B.f 致电A.f 致电A.g
事实上,当我遇到无数次递归时,我得到了一个RecursionError:
B.g 致电B.f 致电A.f 致电B.g
我没有正确理解什么?
这是一个实现:
class A:
def f(self):
print('Method A.f was called.')
self.g()
def g(self):
print('Method A.g was called.')
class B(A):
def f(self):
print('Method B.f was called.')
super().f()
def g(self):
print('Method B.g was called.')
self.f()
b = B()
b.g()
澄清一下:在我的应用程序中,A 是一个 scikit-learn 类,f 是 fit,g 是 fit_transform。在这个 scikit-learn 类中,fit_transform 被显式覆盖,而fit 不幸地使用了fit_transform。为了确保我的子类B 不会从A 继承fit_transform,我必须以通常的方式重新定义它,这会导致如解释的那样无限递归。
【问题讨论】:
-
self.g()实际上是b.g(),就像您最初的通话一样。
标签: python class recursion infinite-recursion