父类的覆盖方法

时间:2015-12-07 10:52:31

标签: python inheritance

假设我们有这两个类:

class B(A):
    def process(self):
        for item in self.items:
            self.process_item(item)

class C(B):
    def process(self):
        # Do some other stuff
        super(C, self).process()

现在我想使用C,但我需要process表现如下:

def process():
    # Do some other stuff
    for item in self.items:
        try:
            self.process_item(item)
        except ItemError as err:
            handle_error(err)

我的自然方法是将C作为D继承并覆盖process。 不过,我不想重复#Do some other stuff部分。所以基本上我需要改变B.process的行为。有什么优雅的方式来做我想要的吗?我不拥有ABC

2 个答案:

答案 0 :(得分:2)

由于C正确使用super,你可以做一些聪明的事情来解决方法解析顺序并把你自己的类放在B和C之间:

class Intermediate(B):
    def process(self):
        for item in self.items:
            try:
                self.process_item(item)
            except ItemError as err:
                handle_error(err)

class D(C, Intermediate):
    pass

现在,给定一个D的实例,来自C.process的超级调用将调用Intermediate.process而不是B&#39的版本。

这确实需要定义两个类,即使其中一个是空的,所以关于它是否比猴子修补更清晰是一个意见问题。

答案 1 :(得分:1)

<强>更新

鉴于对此答案的评论中的澄清,继承C并使用它绝对是可行的方法。

<强>以前

你可以修补A

def process(self):
    amazing_stuff()

A.process = process