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

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

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

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

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

【问题讨论】:

    标签: python class inheritance base-class overwrite


    【解决方案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__
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2017-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    相关资源
    最近更新 更多