python3xiaobaike_2020/chapter7/7-1 python3小白课:一节课搞懂面向对象.md
2025-04-20 23:22:14 +08:00

101 lines
6.4 KiB
Markdown
Raw Permalink 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小白课一节课搞懂面向对象
在学习python的类class和对象object之前我们先来搞懂什么是面向对象编程OOP有些同学会戏称为面向`对象(你家的男女朋友)`编程,开个玩笑,能记住最好)。
因为概念相对比较抽象咱一板一眼的解释大家肯定看不懂所以我思虑再三也结合了一些网络资料的解释用最通俗易懂的生活中的故事来跟大家解释面向对象的思想以及面向对象的三大特性——封装Encapsulation、继承Inheritance、多态Polymorphism
本例中的图片源于网络并做了一定的PS仅供学习说明使用。
### 类的封装
冬天到了,屋里好冷啊,这时候我们就需要一个`暖风机`了。暖风机插上电之后就可以送暖风了。
这时候我们就有一家生产暖风机的厂商,他们生产的暖风机如图所示:
![图7-1-1 暖风机](assets/7-1-1.jpg)
从上图的特点,我们类比面向对象的概念,暖风机这类产品它的生产规范是固定好的,有上图打勾的三个特点,这一`类`产品,我们称之为`暖风机类`,这个类里面可以定义一些东西,比如:
* 类的成员变量:机身、加热片
* 类的成员属性:机身是`红色`
* 类的成员方法:可以通过温控旋钮方法来启动关闭暖风机,传入不同的参数还可以有不同档位的温度(是不是有点像函数?)
`类`是一系列特征的抽象形式,`暖风机类`仅能定义规范,但不是实实在在到你手中的产品。所以我们需要使用`对象`来将`类`实例化比如这个工厂参照着这样的标准生产了1000台暖风机如果你编个号那就是暖风机1号、暖风机2号……
这些具体的产品,就是我们所说的`对象`,就是抽象`类`实例化后的产物。
> [!note]
>
> 如果这个例子你不好理解,我补充一个小例子。人类是`类`,是抽象的,但我们许许多多的不同的人就是`人类`实例化后的产物,所以我们是`对象`,也叫一个类的`实例`。
类里面,我们可以定义一些变量、属性、方法等,方法就类似我们平常说的函数,可以执行一系列的动作等,但只有这个类才拥有这些方法,外部需要调用该类的方法,比如对类进行实例化。比如理论上每个人都会`走路`这个方法,需要实例化到每个人,才能调用每个人的`走路`方法。
将变量、属性、方法等定义到某个类中,仅有这个类或类的实例(也就是对象)才能访问它们,它可以将内部的一些实现细节隐藏起来,跟外界隔绝,如果各种实例的方法实现均需要修改,则修改类内部的成员定义即可,维护起来也是颇为方便的。
这,就是`类的封装`
---
### 类的继承
有一天,这个暖风机工厂的老板说,暖风机上如果有`摇头`的功能,那些暖风可以不一直吹着某个位置,肯定能卖得更好!所以要求工厂生产一种全新的暖风机,我们称之为`会摇头的暖风机`
这时候,工厂有如下选择:
* 设计一个全新的`会摇头的暖风机`
* 在现有`暖风机`的基础上,增加一个按钮,按下去就摇头,再按一下就固定
> [!question]
>
> 从节约成本的角度来说,你会选择哪种方案?
显然,选择第二种方案更加节约成本,因为它只是增加了一个按钮,我们可以将它设计为暖风机的`新方法`
这时候我们直接在之前的`暖风机类`上改设计的代码吗?不对,因为`暖风机类`我们之前已经定义过,就是具有之前那几个特征的普通暖风机。
这时,我们在代码中可以使用`继承`的方法,将新的`会摇头的暖风机类`继承自原来的`暖风机类`,这样它就默认拥有了之前`暖风机类`的特点、方法等。
![图7-1-2 会摇头的暖风机](assets/7-1-2.jpg)
继承后,我们在新的`会摇头的暖风机类`中额外定义一个新的方法:摇头,即可。
实现继承的类`会摇头的暖风机类`称之为继承类或子类,被继承的类`暖风机类`被称为父类、基类或超类。我个人多数会叫`父类``子类`这样的叫法。继承类会自动拥有基类的所有特征成员,子类更像是父类的进一步扩展,这里好像颇有青出于蓝而胜于蓝之意,代码维护起来也颇为方便。
这,就是`类的继承`
---
### 类的多态
基于封装和继承的特性,面向对象还能延伸出多态的特性来,简单来说,就是不同的对象对于同样的方法可以呈现出多种不同的状态。
我们举例说明,还是接着上面的例子。
夏天到了暖风机卖不动了即使工厂的暖风机能360°摇头估计销量也不太行了天气太热了当然还是空调落地那种比较好。
这时候,我们就不说方案了,直接选择继承之前`会摇头的暖风机类`来进一步开发比较省事省钱,新的类名为`会摇头的冷风机类`
但是这机身里面放的是啥?是加热片!那怎么能制冷呢?这时候我们可以`重写`父类里面的成员和方法,比如变量修改为机身+制冷片,旋钮的方法修改为调节旋钮可以控制冷风的大小。我们改成下图这样:
![图7-1-3 会摇头的冷风机](assets/7-1-3.jpg)
同样是调用同名的成员变量(机身组成)和成员方法(温控旋钮),我们的冷风机却展现出截然不同的功能。
> [!note]
>
> 再补充一个小例子,一般的鸟类都会飞,鸵鸟也是一种鸟,继承了`鸟类`这个类,但它不会飞,所以它内部改写了`会动翅膀`这个方法的实现,普通的鸟实现下来就是飞起来了,而鸵鸟的代码实现却是飞不起来的。
这,就是`类的多态`
### 单词释义
| 单词 | 释义 |
| ------------- | ------------------------------------------- |
| class | 类 |
| object | 对象 |
| OOP | Object Oriented Programming面向对象程序设计 |
| Encapsulation | 封装性 |
| Inheritance | 继承性 |
| Polymorphism | 多态性 |