面向对象
一.概述
1.面向过程:根据业务逻辑从上到下写垒代码
2.函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
2.面向对象:对函数进行分类和封装,让开发"更快更好更强"
其实在用不用面向对对象这件事其实跟你编写的程序需求有很大的关系,有时候你会发现用函数要比用面向对象更为简单,那么这个时候我们就选择简单的
面向过程编程是比较好懂的,如果你发现在你编程的过程中有很多代码是重复的这份个时候我建议你考虑一下用面向过程的思想去考虑修改你的代码.
二.创键类和对象
面向对象的编程最主要的就是两个点,一个是类,一个是对象.
在定义类的过程中没有一个绝对的概念,都觉得自己定义的类是最简单的但是,这个在最开始的时候没有一个准确的结论,因为每个人的思想都是不一样的,对于事物的看法就完全不一样,举个很简单的例子,比如说现在你要创建一个游戏,里面有很多的角色也有很多的战斗模式,那么你的类应该怎么去定义,有的人就觉得拿人物角色去定义类要好一点因为在修改的时候都是在对角色进行改动所以这样更方便一点,但是就有的人认为拿战斗,模式去定义类要好一点因为所有的角色都是在特定的几个模式里去操作经验值和战斗力的变化都是一样的,你能说有错吗?
所以说在定一类的时候要站在大局的观念去看待问题,哪一种定义在我们以后的编程中有利,那我们就按照这种方式去定义,在刚开始学习用面向对象编程的时候应该多看,只有你看的多了对于类的定义也就有自己的把握了,会省掉很多的麻烦.
那么我们接下来定义一个简单的类
这里你可能感受不到面向对象的好在哪里,那么我们假设在函数中我有很多的实参需要传递呢?有的同学会说那我就用动态传参呀!对!你说的没有错但是那么如果在这个类里面有很多个函数,每次都需要很多的形参你该怎么办?复制粘贴吗?你的方法真的是很多但是要有成千上百的函数需要一次传参你或许就疯了,这个时候面向对象中的类穿参方式就为我们省掉很多的事.
这里做个简单的总结:
面向对象:创建对象,通过找对象的相同点执行函数 [归类+提取公共值]
函数编程:直接执行函数
三.面相对象的三大特征
封装.继承.和多态
1.封装
什么是封装呢??
封装就是将内容封装到某个地方,以后再去调用被封装在某处的内容.
比如你在超市买了一大堆的东西,这时候你要回家还要骑自行车,怎么办?那么我么用一个塑料袋把东西装在一起这样不就好拿的多了吗,这里的封装就像这个塑料袋一样,把你用的东西封装在一起 你用的时候就好用了.
在使用面向对象的封装特性时,需要:
1>将内容封装到某处
2>从某处调用被封装的内容
对于封装来说,其实就是使用构造的方法将内容封装到对象中,然后通过对象直接或self间接获取被封装的内容
二. 继承
继承的概念跟我们生活中理解的很相似即:子可以继承父的内容
通俗一点就是王思聪没有的可以到他爸爸哪里要,就是这么个关系
面相对象的继承就是将多个类共有的方法提取到父类中,子类仅需要继承父类而不必实现每一个方法.
用着用着问题就出来了.
是否可以继承多个类?
如果继承的多个类每个类中都定了相同的函数,那么哪一个会被使用呢?
1.Python的类可以继承多个类,Java和C#中则只能继承一个类
2.Python的类如果继承了多个类,那么其寻找方法的方式有两种,分别是:深度优先和广度优先
当类是经典类时.多继承情况下会按照深度优先的方式查找
当类是新式类时.多继承情况下,会按照广度优先的方式查找
经典类和新式类,从字面上可以看出一个老一个新,新的必然包括的更多的功能.也是之后推荐的写法,从写法上区分的话,如果当前类或者父类继承了object类,那么该类便是新式类,否则便是经典类
三.多态
Python不支持Java和C#这类强类型语言类型中多态的写法,但是原生多态,其Python崇尚"鸭子类型"
总结:
面向对象是一种编程方式.此编程方式实现是基于对类和对象的使用
类 是一个模板,模板中包装了多个"函数"供使用
对象,根据模板创建的实例(即:对象).实例用于调用被包装在类中的函数
面向对象的三大特征:封装. 继承,多态
补充知识点:
在面向对象的多继承中遗留一个经典类和新式类
首先要声明的就是在python2 中是既有经典类还有新式类,而在python3中只有新式类
1.那么就引出了新式类的概念:如果自己或自己的先辈只要有人继承了object,那就是新式类
2.经典类和新式类的区别:
两者的查找顺序不一样:经典类的查询遵循的是“一条道走到黑”学名"深度优先"
新式类:采用的是C3算法 最小类 + 第一层类的父类+第二层类的父类+第N层类的父类
3.什么是C3算法?
class A(object): pass class B(A): pass class C(B): pass class D(object): pass class E(D,C): pass class F(object): pass class G(F): pass class H(C,G): pass class Foo(E,H): pass print(E.__mro__) print(H.__mro__) """ L(Foo + L(E) + L(H) ) 详细的解释 L(E) = E,D,C,B,A,object L(H) = H,C,B,A,G,F,object Foo = (object) + (G,F,object) Foo,E,D,H,C,B,A,G,F,object """ print(Foo.__mro__)
大致的计算过程就是首先获取第一个表达式和其他表尾进行比较,不存在的拿走如果存在则放弃然后获取第二个表达式再次和其他的表尾进行比较
新式的类一般是不会太复杂一般继承两到三个父类然后深度也不会超过五层但是面试的时候就会出一些古怪的题目主要看你对C3算法的掌握
注意事项:
super是遵循__mro__执行顺序的
python2中没有__mro__