在python oop中授权

时间:2015-06-06 12:19:39

标签: python oop

我不明白在下面的代码中需要额外的“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()的结果。

您能提供用例或引用/指针吗?谢谢!

1 个答案:

答案 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.

正如您所看到的,这个习惯用法允许子类改变某些方面,同时强化其他方面的一致性。恕我直言,这是一个非常好的主意。