我不明白在下面的代码中需要额外的“delegate”-layer,来自Mark Lutz的Learning Python,5ed:
class Super:
def method(self):
print('in Super.method')
def delegate(self):
self.action()
class Provider(Super):
def action(self):
print('in Provider.action')
这意味着您必须在子类中指定action-method,以使delegate-method-call工作。
Super().delegate() ====> Error!
Provider().delegate() ====> Works, prints 'in Provider.action'!
为什么不在子类中编写委托方法?换句话说,从Super完全删除委托,仅在Provider中代码。结果仍然是来自Super.delegate()的错误和来自Provider.delegate()的结果。
您能提供用例或引用/指针吗?谢谢!
答案 0 :(得分:3)
Mark Lutz真的无法回答,但我可以解释为什么我认为这是一个好主意。它类似于making virtual functions nonpublic的C ++指南。
这个想法如下:当基类提供可以被覆盖的公共接口时,没有一个接口点可以通过它来传递所有东西。您是否希望稍后记录某些内容,验证参数等?如果你不这样做,你就不能。
所以在这里,在Python中,它是这个规则的类比:
class Super:
def delegate(self):
# -> Single interface point; log, verify, time, whatever <-
self.action() # <- This varies on the subclass.
正如您所看到的,这个习惯用法允许子类改变某些方面,同时强化其他方面的一致性。恕我直言,这是一个非常好的主意。