84 lines
3.1 KiB
Markdown
84 lines
3.1 KiB
Markdown
# python3小白课:类的继承和多继承
|
||
|
||
继承也是面向对象的三大特征之一,它是软件实现复用的重要手段,所以一定要学好,在python中,类可以直接继承自其它的0个到多个类。
|
||
|
||
继承的语法如下:
|
||
|
||
```python
|
||
class 子类类名(父类类名1, 父类类名2, ...):
|
||
# 下面是类定义的部分
|
||
```
|
||
|
||
对比类的定义,其实继承很简单,就是在类名后面加上括号,里面写上继承自哪些父类即可。继承后,可以拥有父类的各种方法等,无需再重新定义一次,很方便,这样可以实现复用。
|
||
|
||
> [!tip]
|
||
>
|
||
> 之前的课程中我们学习的类的定义都是没有定义父类的,他们都有一个默认的父类`object`,所以`object`类是所有类的父类。
|
||
|
||
接下来我们来看一个简单的例子:
|
||
|
||
```python
|
||
# coding:utf-8
|
||
class Fruit:
|
||
def info(self):
|
||
print("我是一个水果,我的颜色是%s" % self.color)
|
||
class Food:
|
||
def taste(self):
|
||
print("我是一种食物,不同的食物味道不同")
|
||
class Banana(Fruit, Food):
|
||
pass
|
||
|
||
# 创建Banana香蕉对象并使用
|
||
b = Banana()
|
||
b.color = "yellow"
|
||
# 调用实例方法
|
||
b.info()
|
||
b.taste()
|
||
```
|
||
|
||
我们运行后会发现,即使我们对`Banana`这个类里面啥都没有定义,但因为它是继承自水果、食物这俩父类,所以可以赋值里面的实例变量,也可以调用父类里面的方法,这就是类的继承在python中的小例子。
|
||
|
||
> [!danger]
|
||
>
|
||
> 需要注意的是,很多其他编程语言不支持多继承,而python是支持的,在没有必要的情况下,尽量使用单父类继承,这样逻辑比较清晰,也不容易出现莫名其妙的错误。
|
||
|
||
你还需要想到的一点是,如果进行多继承时,多个父类之中有同名方法怎么办?事实是,排在前面的父类中的方法会屏蔽排在后面的父类中的同名方法。我们来看个小例子:
|
||
|
||
```python
|
||
# coding:utf-8
|
||
class Fruit:
|
||
def info(self):
|
||
print("我是一个水果,我的颜色是%s" % self.color)
|
||
class Food:
|
||
def info(self):
|
||
print("我是一种食物,不同的食物味道不同")
|
||
class Banana(Fruit, Food):
|
||
pass
|
||
|
||
# 创建Banana香蕉对象并使用
|
||
b = Banana()
|
||
b.color = "yellow"
|
||
# 调用实例方法
|
||
b.info()
|
||
```
|
||
|
||
可以看到,虽然我们继承的两个父类都有`info`这个方法但是因为顺序原因,后面的那一个`info`方法并没有被执行。
|
||
|
||
> [!danger]
|
||
>
|
||
> 上述的例子都是最终继承下来的子类是不定义任何方法的,事实上,我们也可以在子类中定义子类特有的方法,比如香蕉相比水果和食物,可能还有自己的特性,比如需要剥皮来吃等,这样可以在子类中定义自己的特有方法,而不影响父类。这一点我们就不展开讲了,你理解成子类可以扩展(extend)父类即可。
|
||
|
||
|
||
|
||
### 单词释义
|
||
|
||
| 单词 | 释义 |
|
||
| ------ | ---------- |
|
||
| object | 对象 |
|
||
| Fruit | 水果 |
|
||
| Food | 食物 |
|
||
| color | 颜色 |
|
||
| taste | 味道,滋味 |
|
||
| Banana | 香蕉 |
|
||
| yellow | 黄色 |
|
||
| extend | 扩展 | |