Наследование Python - вызов методов базового класса внутри дочернего класса?

Это меня озадачивает, как я не могу найти ясного объяснения этому в любом месте. Почему и когда вам нужно вызвать метод базового класса внутри метода с одним именем дочернего класса?

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

Обратите внимание, что соответствующий способ сделать это использовать 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)

Ответ 2

Это полностью зависит от класса и метода.

Если вы просто хотите сделать что-то до/после запуска базового метода или вызвать его с разными аргументами, вы, очевидно, вызываете базовый метод в методе вашего подкласса.

Если вы хотите заменить весь метод, вы, очевидно, не называете его.