python 多级继承 、替代原则

1,458 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情

多级继承

向类层次结构添加了另外几个级别的继承。

image.png

添加uG似乎是合乎逻辑的,因为我们希望将一年的毕业(或者可能是预期的毕业)与每个本科生联系起来。但是班级的学生和毕业生发生了什么?通过使用Python保留字传递作为主体,我们指示该类除了从其超类继承的属性之外没有其他属性。为什么有人想要创建一个没有新属性的类?

通过引入Grad类,我们获得了创建两种学生的能力,并使用他们的类型将一种对象与另一种对象区分开来。例如,代码

image.png

将打印

image.png

中级类型学生的效用更微妙。考虑返回类MIT_person并添加方法

image.png

函数实例内置于 Python 中。isinstance 的第一个参数可以是任何对象,但第二个参数必须是类型类型的对象或类型类型的对象的元组。当且仅当第一个参数是第二个参数的实例(或者,如果第二个参数是元组,则为元组中某个类型的实例),则该函数返回 True。例如,实例值([1,2],列表)为 True。

回到我们的示例,代码

image.png

打印

image.png

请注意,实例(p6,学生)的含义与类型(p6)==学生的含义完全不同。p6 绑定到的对象是 uG 类型,而不是学生,但由于 UG 是学生的子类,因此 p6 绑定的对象是类 Student 的实例(以及MIT_person和人的实例)。

由于只有两种类型的学生,我们可以实施is_student,

image.png

但是,如果以后添加了新类型的学生,则有必要返回并编辑实现is_student代码。通过引入中级班级学生并使用实例,我们避免了这个问题。例如,如果我们要添加

image.png image.png

在程序的创建和后期维护期间,返回并向旧类添加新类或新属性并不罕见。优秀的程序员设计他们的程序是为了最大限度地减少完成此操作时可能需要更改的代码量。

练习:以下表达式的值是什么?

isinstance('ab', str) == isinstance(str, str)

替代原则

当使用子类来定义类型层次结构时,应将子类视为扩展了其超类的行为。我们通过添加新属性或重写从超类继承的属性来实现此目的。例如,转学学生通过介绍以前的学校来扩展学生。

有时,子类会重写超类中的方法,但必须小心完成此操作。特别是,超类型的每个子类型都必须支持超类型的重要行为。如果客户端代码使用超类型的实例可以正常工作,那么当子类型的实例被替换时(因此,短语替换原则),它也应该正常工作。例如,应该可以使用学生的规范编写客户端代码,并使其在FmiterStudent上正常工作。

相反,没有理由期望为转移学生编写的代码应该适用于任意类型的学生。