不会面向对象,别说你会编程(python篇)
不知道你是否想过,人类创造编程、学习编程是为了什么呢?如果不是真正的喜欢编程,我们对它的认知很可能只停留在因为编程能给我们带来收益,为了生活而编程。那么,当你真正走进了解编程语言的发展历史后,你会发现,编程本质上其实也就是一个工具而已,当然,前面讲到的为了生活而编程实际上也并不错,但是如上升到人类发展进程的阶层来看,那么,再这样理解的确是有些片面了,一开始设计计算机的人实际上并不知道今天会出现编程语言这样的东西。因为当时发明计算机的初衷实际上也是很简单的,与其说当时人们想发明一台计算机,还不如说当时人们想发明一台“计算器“,这台“计算器“可以帮助人们处理简单但是用人工计算话花费时间很长的计算问题。而后来到1946年第一台计算机ENIAC问世,才算上是第一台真正意义上的计算机。当然,到底是谁发明了第一台计算机,对于这个问题,你上百度搜一下,会有不同的答案,可能每个人持有的观点也会不同,但是这并不重要,我们只要知道,发明计算机的初衷和后来的编程的出现就行了。编程语言是在计算机问世后才慢慢形成的一个体系。由于计算机问世后,人类想要计算机去为自己处理计算任务,就必须要给它输入指令,让计算机根据我们的指令做出相对应的工作,所以一开始的编程语言叫做指令式编程语言
,后来,由于所要处理的问题的规模和负责程度都在不断加剧,所以出现了函数、变量、等这些名词,他们都是为解决编程复杂问题而逐步被提出来的概念和方法。这个时候的编程方式叫做面向过程编程。实际上不断出现的问题都是由于计算机的没有人一样的思考方式,如果人想要让计算机处理人给出的工作,就必须要将人的想法通过编程语言转换成计算机能够识别的机器语言。而想处理任何一个问题都需要做这样的工作,不仅对于人来说少了很多乐趣,而且这对于人的智力要求也是一个极大的考验,并不是每个人都能够做这样的事情。这也就是后来出现了软件危机等问题的主要原因。面向过程变成当然也不是不能解决有难度的问题,但是,用面向过程编程去解决复杂的问题带来的是人思维上的极大考验和程序的维护性极低的问题。人们亟需找到更适合的编程方法。
1.什么是面向对象
诞生于上世纪70年代的Smalltalk语言让软件开发者看到了希望,因为它引入了一种新的编程范式叫面向对象编程。这个名字实际上我听说时是很想骂取这个名字的人的,因为人们在没有接触到面向对象这个词之前我相信和我一样,习惯名词性的命名规则。比如就算叫对象式编程、函数式编程(现在流行的另一种编程方式)也比较好见名知意容易理解吧。而面向对象在我看起来是一个动词更像是一个短语。这样的取名方式真让我理解不了。但是,在现在,才似乎知道了这个名字的真正含义。
什么是面向对象编程呢?这样来讲:现在我们将计算机比喻成一只警犬。然后今后我们是要让这只警犬去抓嫌疑犯、做搜毒品等工作的。那么如果采用面向对象编程,那么一开始的这只狗是一只“傻狗”,什么也不会,我们想想要叫它去搜毒品。我们需要教会他一套整体的寻找流程,比如向前走、找都嫌疑物品、用鼻子闻、分析味道属于哪一类、判断是哪一类东西、不是毒品继续搜、是毒品就叫、、、、、、每次搜毒,都要这样做一遍。
而如果用面向对象编程,就算这只狗一开始是一只傻狗,我们只需要教会这样一帮狗把它该会的动作都教会(现在他们有了一个共同的名字叫警犬),然后告诉它们说这叫搜毒,在搜毒时我们只需先找出这样一只狗,然后说去搜毒,它就会使用自己学会的搜毒能力去搜毒了。每次我们想要搜毒,就先找到一只警犬(面向对象编程中叫用警犬类造一个警犬对象),然后告诉它我们要搜毒就行了。而且随着这样的狗的长期进化,后来生出来的狗,其实在刚生出来是一只小警犬了,因为它具有了警犬有的特征。有些东西不学就已经会了(这叫继承,就像黑人天生就要比其他人跑得快一点),很显然,面向对象的这种编程理念更符合人的思考方式,所以在给计算机传入指令时,我们当然更能接受后者的方式。因此,使用面向对象编程我们需要理解这样几个关键词类、对象、*封装性、继承性、多态性
类
万物皆是对象,而我们可以将含有相同特征(静态特征和动态特征)的对象在逻辑上归为一类。得到的这个大的概念就叫做类。就好比我们将形状都是圆的形状就称之为圆类,将都会两只脚走路都有两只手,每天都需要吃饭睡觉会说话这样的动物统称为人类一样。而类中的实体就叫做对象,比如人类中的邓翔宇这个实体就是一个对象,这个对象有人类的基本特征(编程上一般指静态特征,也叫属性,比如人类的基本属性有名字、性别、年龄等)和行为(编程上叫做方法,比如人类的行为有吃饭、睡觉、玩等),而里面的每一个对象也都有这个属性和方法。那么,如果要叫我吃饭,我知道怎么吃,而不是说拿起食物、嚼几下、吞、、、因此在编程上运用这样的理念,在解决一个问题时,我们先看它需要哪些类的对象去做各自的事情,然后根据这些对象相互做的事情而得到最终所要的结果。说白了,使用面向对象编程就是一个三步走的过程。
面向对象编程三步走:
**1.定义类:**命名使用驼峰命名法
数据抽象:找到对象相关的静态特征(属性)找名词
行为;找到和对象相关的动态特征(方法)找动词
2.造对象
3.发消息
如果你明白了我上面说的警犬的例子,相信你很容易就理解了三步走
对象
对象就是前面讲到的某一个类的一个具体实体,万物皆对象,当然,类本身也是一个对象,比如黄种人是人类的一个对象,而码农邓翔宇是属于黄种人类的一个对象。在编程时,我们首先要创造类,然后用类去找出一个实体(因为只有实体才能做具体的事情),然后对这个对象发消息(可以理解为命令它做事情),接下来就是等待结果的时间了。这就是上面说的面向对象编程三步走。下面我们用一个最简单实例,带你用面向对象编第一个程序。
2.面向对象编程基础实例
在python中,创建一个类,用class关键字,类的名字要用驼峰式命名(每一个单词开头字母要大写),如学生成绩类可以这样命名StudentScore。
下面我们创建一个类叫做学生,我们想要让一个学生吃饭、玩游戏、学习。代码为
第一步:定义类
class Student:
"""人""" # 为类注释
def __init__(self,name,gender,age): # 魔法方法,主要用来定义类的属性,self代表是对象
self.name = name # 添加属性要加上self代表是对象的属性
self.gender = gender
self.age = age
def eat(self): # 用来定义类的吃饭这个方法
"""吃饭"""
print(f'{
self.name}在吃饭') # 先用print来表示一下吃饭的动作
def play(self, game_name):
"""玩"""
print(f'{
self.name}在玩{
game_name}')
def study(self, course):
"""学习"""
print(f'{
self.name}在学习{
course}')
2.造对象
stu = Student("李华",'男','21') # 用stu叫类Student的对象的引用,
# 就像相当于是提供给一个用户操作对象的一个接口,也相当于给这个对象这个名字,就像a = 1,将1赋值给a
3.发消息
# 用对象.方法的形式给对象发消息
stu.study('python程序设计') # 李华在学习python程序设计
stu.play('吃鸡') # 李华在玩吃鸡
stu.eat() # 李华在吃饭
虽然这看起来没有什么特别的地方,因为这里将它大材小用了,这里只是为了让初学者更好理解面向对象编程而举的例子。当在面对复杂的问题时,你才能看见它魅力,那时候直接像之前(面向过程)一样写的代码就显现出了它的不足之处。
3.面向对象的三大支柱
封装性
封装性对于面向对象编程,简单理解起来就是说,将代码用类封装起来隐蔽了其内部细节,而只提供给用户访问的接口(如给对象发消息),这样做的好处在于,在操作对象时,我们并不需要也没有必要知道对象的方法实现过程,我们只需要简单给对象发消息就可以达到目的,而封装的工作由别人或自己来做,Python中有很多第三方库,这些库里面基本已经有了别人封装好了的类和方法,我们通常只要会调用(给它的对象发消息)就可以达到我们要的目的。
继承性
继承:对已有的类进行扩展创建出新的类,这个过程就叫继承。
提供继承信息的类叫做父类(超类、基类),得到继承信息的类称为子类(派生类)
实际上,就像这样一个关系,比如人类是一个类,黄种人也可以是一个类,黄种人类是人类的一个子类,因为黄种人类也是人类的一种,现在,如果我们要写黄种人这个类,我们可以不需要写人类这个类里面的所有东西,这时候我们可以通过继承人类这个类,就得到了人类的所有东西,接下来,我们还可以在里面添加自己独有的东西。
类的继承举例