【问题标题】:Extending the behavior of an inherited function in Python在 Python 中扩展继承函数的行为
【发布时间】:2015-05-03 13:16:55
【问题描述】:

假设我们有以下类:

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

【问题讨论】:

  • 将逻辑 A 和 B 拆分为两个不同的功能?

标签: python function inheritance overriding decorator


【解决方案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

【讨论】:

  • 关闭,但我的目标是在 B 之前调用逻辑 C
  • 但问题是,我不想明确地调用逻辑 A 或 B...逻辑 C 基本上只是 Base load() 的扩展
  • @Unit978 你是说你想让子函数在基类函数中间执行?
  • 也许将执行逻辑 C 的函数传递给基类函数并在逻辑 A 和逻辑 B 之间调用它?
  • @Unit978 我用其他可能性修改了答案。
猜你喜欢
  • 1970-01-01
  • 2014-02-21
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-18
  • 2013-03-11
相关资源
最近更新 更多