第十二章Python继承和多态习题与答案--中文
### 知识点总结 #### 1. Python 继承基础 **继承** 是面向对象编程的一个核心概念,它允许创建一个新类(称为 **子类** 或 **派生类**),该类继承了现有类(称为 **父类**、**基类** 或 **超类**)的所有属性和方法。 **示例 12.1** ```python class A: def __init__(self, i=0): self.i = i class B(A): def __init__(self, j=0): self.j = j def main(): b = B() print(b.i) print(b.j) main() ``` - **知识点**: - 在这个例子中,`B` 类继承自 `A` 类。 - `B` 的构造函数没有显式调用 `A` 的构造函数,因此不会初始化 `A` 中的 `i` 属性。 - **答案解析**: 选项 A 正确,因为虽然 `B` 继承自 `A`,但没有通过构造函数初始化 `A` 的属性 `i`。因此,当尝试打印 `b.i` 时,会使用 `A` 类中的默认值 `0`。 #### 2. 使用 `super()` 调用超类构造函数 **示例 12.2** ```python class A: def __init__(self, i=1): self.i = i class B(A): def __init__(self, j=2): super().__init__() self.j = j def main(): b = B() print(b.i, b.j) main() ``` - **知识点**: - 当使用 `super().__init__()` 时,会调用 `A` 类的构造函数,从而初始化 `i`。 - **答案解析**: 选项 C 正确,因为 `B` 类的构造函数通过 `super().__init__()` 调用了 `A` 的构造函数,并设置了 `i` 和 `j` 的值分别为 `1` 和 `2`。 #### 3. 私有成员和覆盖方法 **示例 12.3** ```python class ParentClass: def __init__(self): self.__x = 1 self.y = 10 def print(self): print(self.__x, self.y) class ChildClass(ParentClass): def __init__(self): super().__init__() self.__x = 2 self.y = 20 c = ChildClass() c.print() ``` - **知识点**: - `__x` 是私有成员,在子类中重新声明了一个同名的私有成员。 - `y` 是公共成员,可以直接访问。 - **答案解析**: 选项 B 正确,子类中的 `__x` 不会覆盖父类中的 `__x`。因此,输出为 `(1, 20)`。 #### 4. 构造函数的正确调用方式 **示例 12.4** - **知识点**: - 调用超类构造函数有两种常见方式:`super().__init__()` 和 `super().__init__(self)`. - **答案解析**: 选项 AD 正确,使用 `super().__init__()` 和 `super().__init__(self)` 都是有效的调用方式。 #### 5. 调用超类构造函数 **示例 12.5** - **知识点**: - 当子类构造函数中需要调用超类构造函数时,可以使用 `super().__init__()` 或 `super().__init__(self)`. - **答案解析**: 选项 BD 正确,`super().__init__()` 和 `A.__init__(self)` 都可以用来调用超类构造函数。 #### 6. 方法覆盖 **示例 12.6** ```python class A: def __init__(self, i=0): self.i = i def m1(self): self.i += 1 class B(A): def __init__(self, j=0): A.__init__(self, 3) self.j = j def m1(self): self.j += 1 def main(): b = B() b.m1() print(b.i, b.j) main() ``` - **知识点**: - 子类可以覆盖父类的方法。 - **答案解析**: 选项 B 正确,`B` 类覆盖了 `m1` 方法,并修改了 `j` 的值。 #### 7. 对于方法覆盖的理解 - **知识点**: - 子类可以覆盖超类的方法,但通常不包括私有方法。 - **答案解析**: 选项 CD 正确,可以覆盖非私有的方法以及初始化方法。 #### 8. 对象的创建过程 **示例 12.8** ```python class A: def __new__(cls): cls.__init__(cls) print("A's __new__() invoked") def __init__(self): print("A's __init__() invoked") class B(A): def __new__(cls): print("B's __new__() invoked") def __init__(self): print("B's __init__() invoked") def main(): b = B() a = A() main() ``` - **知识点**: - 对象创建过程中先调用 `__new__` 方法,再调用 `__init__` 方法。 - **答案解析**: 选项 C 正确,`B` 的 `__new__` 被调用后,会接着调用 `A` 的 `__init__` 方法。 #### 9. 对于 `__new__` 和 `__init__` 的理解 - **知识点**: - 默认情况下,`__new__` 方法并不调用 `__init__` 方法。 - `__new__` 方法在对象创建时被调用,用于创建对象本身。 - **答案解析**: 选项 B 正确,`__new__` 方法在对象类中定义,而 `__init__` 方法在实例化对象后调用。
剩余10页未读,继续阅读
- chenxiaoxiaofan2019-05-18题目质量还行,每道题比较典型Williamchu2019-09-03少见的说人话的人
- 粉丝: 14
- 资源: 71
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助