在Python中扩展继承函数的行为

lam*_*bda 8 python inheritance overriding function decorator

假设我们有以下类:

class Base(object):

    def load(self):
        # do logic A

        # do logic B

class Child(Base):

    def load(self):
        # do logic C
Run Code Online (Sandbox Code Playgroud)

我知道装饰器可以用来扩展Python中的函数行为,但我不知道如何在我的情况下应用它.当Child's load()被调用时,我怎样才能在这个顺序如下代码执行?:

logic A

logic C

logic B
Run Code Online (Sandbox Code Playgroud)

什么我不希望做

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()
Run Code Online (Sandbox Code Playgroud)

我只想编写逻辑C,而不必显式调用逻辑A和B.

Mar*_*cin 12

你的意思是这样的:

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()   
Run Code Online (Sandbox Code Playgroud)

这将打印:

do logic A
do logic B
do logic C
Run Code Online (Sandbox Code Playgroud)

我能想到的唯一另一种方式就是这个:

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()   
Run Code Online (Sandbox Code Playgroud)

这打印:

do logic A
do logic C
do logic B
Run Code Online (Sandbox Code Playgroud)