1

我给了一个A带有方法fg. 在 的实现中A.f,方法self.g被调用,即被A.g使用。(我不能/不愿意改变这个类A,因为它来自一个 python 包。)

现在我想建立一个子类BA想要覆盖方法fg. 在 的实现中B.f,我调用了super().fie A.f。在 的实现中B.g.,我调用了self.fie 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 类,fisfitgis fit_transform。在这个 scikit-learn 类中,fit_transform被显式覆盖,fit不幸的是使用fit_transform. 为了确保我的子类B不继承fit_transformA,我必须以通常的方式重新定义它,这会导致如解释的那样无限递归。

4

3 回答 3

1

B 的 g 方法如您所说覆盖 A 的方法,这意味着 Af 将调用 Bg,如果您更改 Bg 方法的名称,您的代码将按预期运行

于 2020-05-16T15:41:50.157 回答
1

我不正确理解什么?

即使self.g()在内部调用A.f,传递的值self仍然是 的实例B,因此B.g通过此操作而不是 查找A.g

如果你能解释你试图用这个结构解决什么问题,那将会很有帮助。特别是,我不明白为什么对于任何真实世界的g代码,在 B 类中调用 on会很有用f,但在基类中却相反。

于 2020-05-16T15:42:19.927 回答
0

self绑定到被调用的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:
    def __init__(self, a):
        self.a = a

    def f(self):
        print('Method B.f was called.')
        self.a.f()

    def g(self):
        print('Method B.g was called.')
        self.f()

a = A()
b = B(a)
b.g()

输出:

Method B.g was called.
Method B.f was called.
Method A.f was called.
Method A.g was called.
于 2020-05-16T15:43:17.010 回答