Python继承 - 在子类中调用基类方法?

use*_*281 16 python inheritance class overwrite base-class

令我感到困惑的是,我无法在任何地方找到明确的解释.为什么以及何时需要在子类的同名方法中调用基类的方法?

class Child(Base):
    def __init__(self):
        Base.__init__(self)

    def somefunc(self):
        Base.somefunc(self)
Run Code Online (Sandbox Code Playgroud)

当你不想完全覆盖基类中的方法时,我猜你这样做了.是真的有它的全部吗?

Joe*_*ett 13

通常,当您想通过修改扩展功能时,可以执行此操作,但不能完全替换基类方法.defaultdict就是一个很好的例子:

class DefaultDict(dict):
    def __init__(self, default):
        self.default = default
        dict.__init__(self)

    def __getitem__(self, key):
        try:
            return dict.__getitem__(self, key)
        except KeyError:
            result = self[key] = self.default()
            return result
Run Code Online (Sandbox Code Playgroud)

请注意,执行此操作的适当方法是使用super而不是直接调用基类.像这样:

class BlahBlah(someObject, someOtherObject):
    def __init__(self, *args, **kwargs):
        #do custom stuff
        super(BlahBlah, self).__init__(*args, **kwargs) # now call the parent class(es)
Run Code Online (Sandbox Code Playgroud)

  • @ user1369281:嗯,他们并不总是很棒.但是,如果您始终如一地使用它们,则它们使继承树更容易使用.例如,如果我想将我的`defaultdict`更改为默认的_ordered_ dict,该怎么办?如果我使用`super()`,那么我必须在代码中改变的_only_事件就是类定义.所有那些`super`都会自动引用我当前类继承的基类.它有助于黑盒编程. (5认同)

Thi*_*ter 2

这完全取决于类和方法。

如果您只想在基本方法运行之前/之后执行某些操作或使用不同的参数调用它,那么显然您可以在子类的方法中调用基本方法。

如果你想替换整个方法,你显然不会调用它。