首页 > 解决方案 > 当方法被孩子覆盖时,​​在 super().__init__ 中调用父方法

问题描述

我已经覆盖了子类中的方法。该方法在父类构造函数中使用。在子类中调用super().__init__时,在父类的构造函数中执行子类的方法而不是父类的方法。

例子:

class A:
    def __init__(self):
        self.method()

    def method(self):
        print('parent method!')

class B(A):
    def __init__(self):
        super().__init__()

    def method(self):
        print('child method!')

b = B()

输出:child method!

虽然我想得到parent method!

编辑:

我需要父类的构造函数来使用未覆盖的方法,但之后method()从父类调用的每个调用都应该调用覆盖的方法。

标签: pythonoop

解决方案


因为我需要使用不覆盖的方法调用父级的构造函数,但是我每次都需要使用覆盖的构造函数。

这表明您要求一种方法做太多事情。分为method两部分:一个被覆盖并由 调用A.__init__,另一个可以被覆盖。就像是

class A:
    def __init__(self):
        self._init_method()

    def _init_method(self):
        print('parent method!')

    def method(self):
        self._init_method()


class B(A):
    def __init__(self):
        super().__init__()

    def method(self):
        print('child method!')

b = B()

_init_method做你声称需要做的事情A.__init__。同时,你可以method做同样的事情,除非你覆盖它,在这种情况下你会做任何你想做B.method的事情。


推荐阅读