假设我们有这两个类:
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
的行为。有什么优雅的方式来做我想要的吗?我不拥有A
,B
或C
。
答案 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