返回介绍

多重继承:顺序很重要

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

这很明显,但还是需要强调一下:如果使用多重继承,超类列在class语句首行内的顺序就很重要。Python总是会根据超类在首行的顺序,由左至右搜索超类。

例如,在第30章多重继承的例子中,假设Super类也实现了__str__方法。

我们想要继承Lister的还是Super的?由于继承搜索是从左至右进行的,我们会从先列在Sub类首行的那个类取得该方法。假设,我们先编写ListTree,因为这个类的整个目的就是其定制了的__str__(实际上,当把这个类与拥有自己的一个__str__的tkinter.Button混入的时候,我们必须这么做)。

但现在,假设Super和ListTree各自有其他的同名属性的版本。如果我们想要使用Super的变量名,也想要使用ListTree的变量名,在类首行的编写顺序就没什么帮助:我们得手动对Sub类内的属性名赋值来覆盖继承。

在这里,对Sub类中的other做赋值运算,会建立Sub.other——对Super.other对象的引用值。因它在树中的位置较低,Sub.other实际上会隐藏ListTree.other(继承搜索时正常会找到的属性)。同样,如果在类首行中先编写Super来挑选其中other,就需要刻意地选取ListTree中的方法。

多重继承是高级工具。即使你掌握了上一段所讲的内容,谨小慎微的使用依然是个不错的主意。否则,对于任意关系较远的子类中变量的含义,将会取决于混入的类的顺序。(这里所示技术的另一个例子,可以参考本章之前讨论“新式类”模式时所提到的明确解决冲突。)

经验法则是,当混合类尽可能的独立完备时,多重继承的工作状况最好,因为混合类可以应用在各种环境中,因此不应该对树中其他类相关的变量名有任何假设。之前第30章研究过的伪私有__X属性功能可以把类依赖的变量名本地化,限制混合类可以混入的名称,因此会有所帮助。例如,在这个例子中,如果List Tree只是要导出特殊的__str__,就可将其另一个方法命名为__other,从而避免和其他类发生冲突。

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

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

发布评论

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