python 继承

182 阅读3分钟

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

继承

许多类型具有与其他类型相同的属性。例如,类型 list 和 str 各有 1en 函数,这意味着同样的事情。继承为构建相关抽象组提供了一种方便的机制。它允许程序员创建一个类型层次结构,其中每个类型都从层次结构中其上方的类型继承属性。

类对象位于层次结构的顶部。这是有道理的,因为在Python中,运行时存在的所有内容都是对象。由于 Person 继承对象的所有属性,因此程序可以将变量绑定到 Person、将人员追加到列表等。

image.png

该类MIT_person图 10-4 中。从其父类 Person 继承属性,包括 Person 从其父类对象继承的所有属性。用面向对象编程的术语来说,MIT_person是 Person 的一个子类,因此继承了其超类的属性。除了它继承的内容之外,子类还可以:

·添加新属性。例如,子类 MIT_person 已添加类 variable_next_id_num 实例变量_id_num,方法get_id_num。

重写,即替换超类的属性。例如,MIT_person已被覆盖

初始化和It__。重写方法后,执行的方法的版本基于用于调用该方法的对象。如果对象的类型是子类,则将使用子类中定义的版本。如果对象的类型是超类,则将使用超类中的版本。

这方法MIT_person。初始化

第一 使用超级().init_(名称)调用

init_function其超级类(人)。这将初始化继承的实例变量 self。名字。然后,它初始化自身。id_ num,它是MIT_person实例具有但 Person 实例没有的实例变量。

实例变量自身。id num 是使用属于类MIT_person而不是类实例的类变量_next_id_ num 初始化的。创建MIT_person实例时,不会创建下一个 id num 的新实例。这允许 init 确保MIT_person的每个实例都具有唯一的id_num。

参考代码

image.png

第一行创建一个新的MIT_person。第二行更复杂。当它尝试计算表达式 str(p1) 时,运行时系统首先检查是否存在与类MIT_person关联的an_str__method。由于没有,它接下来检查是否有

与MIT_person的直接超类 Person 关联的 str 方法。有,所以它使用它。当运行时系统尝试计算表达式 p1.get_id_num() 时,它首先检查是否存在与类MIT_person关联的 get_id num 方法。有,所以它调用该方法并打印

image.png

(回想一下,在字符串中,字符“\”是一个转义字符,用于指示应以特殊方式处理下一个字符。在字符串中

image.png

“\”表示撇号是字符串的一部分,而不是终止字符串的分隔符。

现在考虑代码

image.png

我们创建了四个虚拟人物,其中三个名叫比利·鲍勃·海狸。其中两个比利·鲍勃是MIT_person类型,一个只是一个人。如果我们执行代码行

image.png

image.png

由于 p1、p2 和 p3 的类型均为 MIT_person,因此解释器在评估前两个比较时将使用类 MIT _person 中定义的1t_方法,因此排序将基于标识号。在第三个比较中,<运算符应用于不同类型的操作数。由于表达式的第一个参数用于确定要调用哪个_1t__method,因此 p4 < p1 是 p4.1t(p1) 的简写。因此,解释器使用 1t

与 p4 类型、人员和“人员”关联的方法将按名称排序。

如果我们尝试打印

image.png

运行时系统将调用与 p1 类型关联的_1t_operator,即类MIT_person中定义的_1t_operator。这将导致异常

属性错误:

image.png