@@ -143,13 +143,13 @@ how_many = classmethod(how_many)
143143
144144面向对象编程的一大优点是对代码的** 重用(Reuse)** ,重用的一种实现方法就是通过** 继承(Inheritance)** 机制。继承最好是想象成在类之间实现** 类型与子类型(Type and Subtype)** 关系的工具。
145145
146- 现在假设你希望编写一款程序来追踪一所大学里的老师和学生。他们具有一些共同的特征 ,例如姓名、年龄和地址。他们同样也有一些独特的特征 ,一如教师的薪水、课程与假期,学生的成绩和学费。
146+ 现在假设你希望编写一款程序来追踪一所大学里的老师和学生。有一些特征是他们都具有的 ,例如姓名、年龄和地址。另外一些特征是他们独有的 ,一如教师的薪水、课程与假期,学生的成绩和学费。
147147
148- 你可以为每一种类型创建两个独立的类,并对它们进行处理。但增添一条共同特征将意味着将其添加进两个独立的类 。这很快就会使程序变得笨重。
148+ 你可以为每一种类型创建两个独立的类,并对它们进行处理。但增添一条共有特征就意味着将其添加进两个独立的类 。这很快就会使程序变得笨重。
149149
150- 一个更好的方法是创建一个公共类叫作 ` SchoolMember ` ,然后让教师和学生从这类中_继承 (Inherit)_ ,也就是说他们将成为这一类型(类)的子类型,而我们就可以向这些子类型中添加某些独特的特征 。
150+ 一个更好的方法是创建一个公共类叫作 ` SchoolMember ` ,然后让教师和学生从这个类中_继承 (Inherit)_ ,也就是说他们将成为这一类型(类)的子类型,而我们就可以向这些子类型中添加某些该类独有的特征 。
151151
152- 这种方法有诸多优点。如果增加或修改了 ` SchoolMember ` 的任何功能,它将自动反映在子类型中。举个例子,你可以通过简单地向 SchoolMember 类进行操作,来为所有老师与学生添加一条新的 ID 卡字段。不过,对某一子类型作出的改动不会影响到其它子类型。另一大优点是如果你可以引用某一老师或学生对象看作 ` SchoolMember ` 的对象 ,这在某些情况下会大为有用,例如在清点学校中的成员数量时 。这被称作** 多态性(Polymorphism)** ,在任何情况下,如果父类型希望,子类型都可以被替换,也就是说,该对象可以被看作父类的实例。
152+ 这种方法有诸多优点。如果我们增加或修改了 ` SchoolMember ` 的任何功能,它将自动反映在子类型中。举个例子,你可以通过简单地向 SchoolMember 类进行操作,来为所有老师与学生添加一条新的 ID 卡字段。不过,对某一子类型作出的改动并不会影响到其它子类型。另一大优点是你可以将某一老师或学生对象看作 ` SchoolMember ` 的对象并加以引用 ,这在某些情况下会大为有用,例如清点学校中的成员数量 。这被称作** 多态性(Polymorphism)** ,在任何情况下,如果父类型希望,子类型都可以被替换,也就是说,该对象可以被看作父类的实例。
153153
154154同时还需要注意的是我们重用父类的代码,但我们不需要再其它类中重复它们,当我们使用独立类型时才会必要地重复这些代码。
155155
@@ -165,15 +165,15 @@ how_many = classmethod(how_many)
165165
166166** 它是如何工作的**
167167
168- 要想使用继承,在定义类[ ^ 6 ] 时我们需要在类后面跟一个包含基类名称的元组。然后,我们会注意到基类的 ` __init__ ` 方法是通过 ` self ` 变量被显示调用的,因此我们可以初始化对象的基类部分。这一点很重要 ,需要牢记——因为我们在 ` Teacher ` 和 ` Student ` 子类中定义了 ` __init__ ` 方法,Python 不会自动调用基类 ` SchoolMember ` 的构造函数,你必须自己显式地调用它。
168+ 要想使用继承,在定义类[ ^ 6 ] 时我们需要在类后面跟一个包含基类名称的元组。然后,我们会注意到基类的 ` __init__ ` 方法是通过 ` self ` 变量被显示调用的,因此我们可以初始化对象的基类部分。下面这一点很重要 ,需要牢记——因为我们在 ` Teacher ` 和 ` Student ` 子类中定义了 ` __init__ ` 方法,Python 不会自动调用基类 ` SchoolMember ` 的构造函数,你必须自己显式地调用它。
169169
170170相反,如果我们_没有_在一个子类中定义一个 ` __init__ ` 方法,Python 将会自动调用基类的构造函数。
171171
172172我们会观察到,我们可以通过在类名前面添加前缀连接类与方法,然后通过 ` self ` 变量调用并传递任何参数,来调用基类的方法。
173173
174174在这里你需要注意,当我们使用 ` SchoolMember ` 类的 ` tell ` 方法时,我们可以将 ` Teacher ` 或 ` Studtne ` 的实例看作 ` SchoolMember ` 的实例。
175175
176- 同时,你会发现被调用的是子类型的 ` tell ` 方法,而不是 ` SchoolMember ` 的 ` tell ` 方法。理解这一问题的一种思路是 Python * 总会* 从当前的实际类型中开始寻找方法,在本例中即是如此。如果它找不到对应的方法,它就会在该类所属的基本类中依顺序逐个寻找属于基本类的方法,这个基本类是在定义类时我们在后面跟的元组中指定的 。
176+ 同时,你会发现被调用的是子类型的 ` tell ` 方法,而不是 ` SchoolMember ` 的 ` tell ` 方法。理解这一问题的一种思路是 Python * 总会* 从当前的实际类型中开始寻找方法,在本例中即是如此。如果它找不到对应的方法,它就会在该类所属的基本类中依顺序逐个寻找属于基本类的方法,这个基本类是在定义子类时后跟的元组指定的 。
177177
178178这里有一条有关术语的注释——如果继承元组(Inheritance Tuple)中有超过一个类,这种情况就会被称作** 多重继承(Multiple Inheritance)** 。
179179
0 commit comments