前言
本文是从感性的角度出发,帮助读者通俗的理解面向对象编程的概念,文章中只会涉及一些构成面向对象概念的必须语法结构,很多细枝末节不会涉及,若某些地方有错误,还请大胆指证.
接下来让我们进入正题!
1.面向过程
- 想要理解面向对象的概念,我们不得不提及面向过程.
- 面向过程编程的实现大概分三步
1.根据需求从头到尾逐步实现我们的功能
2.将某些具有独立功能的代码块封装成函数
3.最终完成代码,按照需求按次序调用函数
我们发现面向过程的编程有以下的特点,或者说是缺点 - 注重步骤和过程,不注重职责的分工
- 当需求变得更多更复杂,我们的函数也会相应变多变复杂
- 当开发复杂项目的时候,我们没有一个固定的模式开发,难度会非常的大
让我们在植物大战僵尸中好好理解一下
比如我们想在想要开发向日葵:
- 我们发现向日葵有这些行为,它会产生阳光,它会晃动.
如果我们采用面向过程编程,我们要逐步实现产生阳光和晃动的功能,然后把向日葵封装成一个函数.
好了你的甲方并不满足于此.他想要一个双头向日葵:
- 我们发现双头向日葵的行为,它要产生两个阳光,同时它也会晃动.接下来我们要逐步实现产生阳光和晃动的功能,然后把双头的封装起来.
其实我们发现两种向日葵有很多相似之处,但是我们没有一个固定的模式,只是根据需求去实现,导致了函数变多,变复杂,开发难度也变大
实际中,如果我们调用的函数里面交叉调用了其它子函数,突然我们要修改子函数在某个父函数中的功能而不想改变它在其它父函数中的作用,就会变得非常麻烦.
2.面向对象
- 面向对象的概念,就能很好的解决上述的问题
- 面向对象注重对象以及其职责,专门对付复杂的项目
- 它提供了固定的套路(模板)
- 本质上是对面向过程的封装,并加入了一些新的语法(个人理解)
- 我们先直接给出类:
- 类包含特征(属性)和行为(方法),我们通过先创造类,进而创造具体的对象
- 创建一个类我们只需要:
class plant(object):
def func_one(self):
pass
......
接下来我们通过植物大战僵尸来介绍一下:
我们同样是创造向日葵,我们注重对象,我们发现对象是向日葵,更抽象一点,是植物.
- 这张图里面,我们创建了一个植物类,它具有一个属性-生命值,一个行为-晃动.如果我们要通过这个类创造一个对象只需要: 向日葵 = 植物类()
- 至于图中还有颗数和被铲除等属性和行为,我们不难发现,所有的植物都有这样的属性和行为,我们称之为类属性,类行为.前面我们说对象才有属性行为,怎么?
- 实际上,在python中,万物皆对象,类其实是基类(object)的一个对象,根据本文的目的,我们不会赘述,只需读者先知道.
- 我们还有问题,通过这个类创造了一个向日葵对象,可是向日葵的行为还有创造阳光啊,你这植物没有啊,怎么弄?我们接着往下看
3.面向对象的特性
a.封装
封装的概念不必多说,就是把一些属性和行为封装到一个类中.
b.继承
- 继承是面向对象特性的重中之重,也是下一个特性多态的基础.
- 上面我们提到的问题,向日葵的行为在植物类中是不足的,我们怎么办?
- 如果是面向过程,你不得不再去单独写一个向日葵的函数.但是我们发现,虽然少了一个行为,但其他的都一样,我们就可以继承父类.
class sunflower(plant):
def ...........
也就是把父类当作参数传入子类.
再把父类没有的行为单独写出来.
- 继承有几个很重要的特性
- 如果说父类方法不满足我子类的需求,比如植物都会晃动,但是我向日葵就是跟你父类晃动的方式不一样,怎么搞?这时候我们直接再子类中重新写就可以了,这并不会影响其它子类继承父类,很好的解决了上述面向过程中的问题.
- 如果我们要在子类中调用父类的方法呢?
super().某某方法 即可调用父类方法
c.多态
有了上述的基础,我们就进而可以引出多态的概念.多态本质上就是不同的对象调用同方法时,会产生不同的结果
-
我们接下来创建一个豌豆射手和玩家类:
-
-
豌豆我们就直接继承植物类,然后在豌豆类中再写吐豆子的方法即可.
-
在创造一个戴夫
-
我们给种植物这个方法传入植物对象,并在其中调用植物的晃动方法.
我们通过人这个类创造一个戴夫对象:
daifu = 人()
- 当我们分别传入向日葵和豌豆的时候,我们并没有改变戴夫种植物方法的代码,但是这俩家伙的晃动方式确实不一样了.
这就是不同的对象调用同一方法得到不同的结果.
END
如果我的文章对你有所帮助,还请点一个免费的赞,评论一下,蟹蟹