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

Posted

技术标签:

【中文标题】Python继承-在子类中调用基类方法?【英文标题】:Python inheritance - calling base class methods inside child class? 【发布时间】:2012-05-11 15:09:37 【问题描述】:

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

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

    def somefunc(self):
        Base.somefunc(self)

我猜当您不想完全覆盖基类中的方法时,您会这样做。真的只有这些吗?

【问题讨论】:

【参考方案1】:

通常,当您想通过修改而不是完全替换基类方法来扩展功能时,您会这样做。 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

请注意,执行此操作的适当方法是发送至use super instead of directly calling the base class。像这样:

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

【讨论】:

这个“超级”功能有什么了不起的? @user1369281:嗯,它们并不总是很棒。但是,如果您始终如一地使用它们,它们会使继承树更容易使用。例如,如果我想将我的 defaultdict 更改为默认的 ordered dict。如果我使用super(),我在代码中唯一需要更改的就是类定义。所有这些super 都会自动引用我当前类继承自的任何基类。它有利于黑盒编程。 我喜欢这个,因为它提醒你(或教导)你的类可以继承多个类。因此,如果您的父类来自您无法修改且尚未继承对象的库,则只需将 object 添加到您的类中即可。【参考方案2】:

这完全取决于类和方法。

如果你只是想在基方法运行之前/之后做一些事情,或者用不同的参数调用它,你显然会在你的子类的方法中调用基方法。

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

【讨论】:

不过,作为旁注,您应该始终调用父类'__init__

以上是关于Python继承-在子类中调用基类方法?的主要内容,如果未能解决你的问题,请参考以下文章

python大法好——继承多态

C++中,继承时,创建子类对象,能否在子类构造函数初始化列表里调用基类构造函数?

Python基础-接口与归一化设计抽象类继承顺序子类调用父类,多态与多态性

继承中的构造方法

子类可以直接调用父类的函数吗

java多态中父类和子类一定要有一样的方法名吗