Расширение поведения унаследованной функции в Python

Допустим, у нас есть следующие классы:

class Base(object):

    def load(self):
        # do logic A

        # do logic B

class Child(Base):

    def load(self):
        # do logic C

Я знаю, что декораторы можно использовать для расширения поведения функций в Python, но я не знаю, как применить это в моем случае. когда Child'sload() называется, как я могу получить следующие исполнения кода в этом порядке?:

logic A

logic C

logic B

Что я не хочу делать

class Base(object)

    def logicA()
       pass

    def logicB()
       pass

    def load()
       pass

class Child(Base):

    def load(self):
        super.logicA()

        # do logic C

        super.logicB()

Я просто хочу закодировать логику C, без необходимости явно вызывать логику A и B

1 ответ

Решение

Вы имеете в виду что-то вроде этого:

class Base(object):

    def load(self):
        print('do logic A')
        print('do logic B')


class Child(Base):

    def load(self):
        super().load()
        print('do logic C')


c = Child()
c.load()   

Это напечатает:

do logic A
do logic B
do logic C

Единственный другой способ, которым я могу думать, является этим:

class Base(object):

    def load(self):
        print('do logic A')
        self.new_logic() # call new logic from child class, if exist.
        print('do logic B')

    def new_logic(self):
        # overwrite this one in child class 
        pass


class Child(Base):

    def new_logic(self):
        print('do logic C')


c = Child()
c.load()   

Это печатает:

do logic A
do logic C
do logic B
Другие вопросы по тегам