python3xiaobaike_2020/chapter7/7-7 python3小白课:重写父类方法和使用super函数.md
2025-04-20 23:22:14 +08:00

93 lines
3.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# python3小白课重写父类方法和使用super函数
### 重写父类方法
子类可以继承父类的方法,但有的时候,子类可能在某些行为上有自己的表现形式,这时候就要重写父类的方法。
咱举个简单的例子,我们知道鸟类有飞翔的技能,​ 鸡也是一种鸟类,那么鸡理论上也继承了飞翔的技能。但实际表现呢?鸡只能扑棱扑棱翅膀,是不能像其他鸟内一样飞的很高的,所以这时候就要重写鸡的飞翔的方法。
> [!tip]
>
> 鸡属于鸟类。
>
> 解析:鸟类在动物分类上属于一个“纲”——“鸟纲”。鸟纲动物就是我们俗称的鸟类。 鸡属于鸟纲,雉科家禽,据研究,鸡的听觉器官(内耳、外耳)对可听声有很好的敏感性。鸡栖息地面,除耳朵外,它的腿部还具有灵敏的振动感受器,震前可能感受到地声,出现行为异常。 所以鸡是鸟类。
![图7-7-1 鸡的图片](assets/7-7-1.jpg)
因此我们可以看一下如下示例代码:
```python
# coding:utf-8
class Bird:
def fly(self):
print("我在天空,自由飞翔")
class Chicken(Bird):
def fly(self):
print("我在地面,扑棱扑棱翅膀")
a = Chicken()
a.fly()
```
重写父类方法会覆盖掉父类原来的代码,就像示例写的那样。
---
### 使用super函数调用父类的构造方法
python规定如果子类重写了父类的构造方法那么子类的构造方法必须调用父类的构造方法。我们可以采用`super()`函数来调用父类的构造方法。
比如我们看这样一个例子:
```python
# coding:utf-8
class Bird:
def __init__(self):
self.name = "鸟类"
def fly(self):
print("我在天空,自由飞翔")
class Chicken(Bird):
def __init__(self):
pass
def fly(self):
print("我在地面,扑棱扑棱翅膀")
a = Chicken()
print(a.name)
```
我们可以看到在这个简单的例子中,子类重写了父类的`__init__`这个构造方法,但里面什么内容也没写,这样一运行,会报错,实际没有继承和运行父类的构造方法。
但如果我们把代码改成这样:
```python
# coding:utf-8
class Bird:
def __init__(self):
self.name = "鸟类"
def fly(self):
print("我在天空,自由飞翔")
class Chicken(Bird):
def __init__(self):
super().__init__()
def fly(self):
print("我在地面,扑棱扑棱翅膀")
a = Chicken()
print(a.name)
```
添加了这一句:`super().__init__()`。这样用`super()`函数指代父类来调用父类的构造方法,这样再执行就可以获取到父类初始化好的`name`信息了。
这样的应用还可以应用在从多个父类继承的情况下如果多个父类都写了自己的构造方法那么默认情况下子类只会调用第一个父类的构造方法并初始化因为排在前面这时候就可以写一个子类的构造方法来分别调用父类的构造方法了这样多个父类继承也都能初始化到了。大家感兴趣可以自己深入再研究一下。初学阶段掌握到这里就ok了。
### 单词释义
| 单词 | 释义 |
| ------- | -------- |
| Bird | 鸟,鸟类 |
| fly | 飞,飞翔 |
| Chicken | 鸡 |
| super | 超级 |