返回介绍

抽象超类

发布于 2024-01-29 22:24:15 字数 1099 浏览 0 评论 0 收藏 0

注意上一个例子中的Provider类是如何工作的。当通过Provider实例调用delegate方法时,有两个独立的继承搜索会发生:

1.在最初x.delegate的调用中,Python会搜索Provider实例和它上层的对象,知道在Super中找到delegate的方法。实例x会像往常一样传递给这个方法的self参数。

2.在Super.delegate方法中,self.action会对self以及它上层的对象启动新的独立继承搜索。因为self指的是Provider实例,在Provider子类中就会找到action方法。

这种“填空”的代码结构一般就是OOP的软件框架。至少,从delegate方法的角度来看,这个例子中的超类有时也称作是抽象超类——也就是类的部分行为默认是由其子类所提供的。如果预期的方法没有在子类中定义,当继承搜索失败时,Python会引发未定义变量名的异常。

类的编写者偶尔会使用assert语句,使这种子类需求更为明显,或者引发内置的异常NotImplementedError(我们将在本书的下一部分中深入学习可能触发异常的语句)。作为提前介绍,下面是assert方法的实际应用示例:

我们将会在第32章和第33章介绍assert。简而言之,如果其表达式运算结构为假,就会引发带有出错信息的异常。在这里,表达式总是为假(0)。因此,如果没有方法重新定义,继承就会找到这里的版本,触发出错信息。此外,有些类只在该类的不完整方法中直接产生NotImplemented异常。

对于子类的实例,我们将得到异常,除非子类提供了期待的方法来替代超类中的默认方法:

要查看这一节中概念的更实际的例子,可参考第31章结尾的习题8以及第六部分中的解答(在附录B)。这种分类法是介绍OOP的传统方式,但是多数开发人员的职务说明中已经或多或少地将它去掉了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文