首先明确一点,在面向对象之前我们一直都是按照面向过程的方式来编写程序!
面向过程的程序设计:核心是过程二字,过程指的是解决问题的步骤,即先干什么再干什么......面向过程的设计就好比精心设计好一条流水线,是一种机械式的思维方式。
优点是:复杂度的问题流程化,进而简单化(一个复杂的问题,分成一个个小的步骤去实现,实现小的步骤将会非常简单)
缺点是:一套流水线或者流程就是用来解决一个问题,生产汽水的流水线无法生产汽车,即便是能,也得是大改,改一个组件,牵一发而动全身。
应用场景:一旦完成基本很少改变的场景,著名的例子有Linux內核,git,以及Apache HTTP Server等。
当今时代背景下,通常应用程序对扩展性和维护性要求都是非常高的,为什么?想想qq,微信,是不是不断的在添加新功能?,也就是说一款应用程序诞生后,都需要不断的更新维护
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。
它将对象作为程序的基本单元
将数据和处理数据的程序封装到对象中
以提高软件的重用性、灵活性和扩展性为首要目的
案例分析1:把大象装进冰箱如何实现
案例分析2:要开一家公司
面向对象编程的优点:
程序员的角色发送了改变,从一个操作者,变成了指挥者,不再需要关心,每个功能具体的实现细节,从而可以专注处理业务逻辑,是一种思想上的转变
大大提高了程序的扩展性,当一个对象发生了修改时,对其他对象时没有任何影响的,对象之间相互独立,耦合度变得更低了
提高了程序的灵活性,例如游戏中,每个玩家的操作都是自由的,而不是机械般固定的!你可以买武器,也可以买护甲
缺点:
编程的复杂度远高于面向过程,不了解面向对象而立即上手基于它设计程序,极容易出现过度设计的问题。一些扩展性要求低的场景使用面向对象会徒增编程难度,如果用面向对象来设计linux,估计现在都没写完
无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法准确地预测最终结果。
应用场景:
需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方
用一个例子来说明面向对象与面向过程的区别:
话说三国时期曹军于官渡大败袁绍,酒席之间,曹操诗兴大发,吟道:喝酒唱歌,人生真爽! 众将直呼:"丞相好诗",于是命印刷工匠刻板印刷以流传天下;
版样再次出来请曹操过目,曹操细细一品,觉得还是不好,说”人生真爽太过直接,应该改问语才够意境,因此应改为‘对酒当歌,人生几何?’“,于是....
在活字印刷术还没出现之前,如果版样有改动,只能重新雕刻。而且在印刷完成后,这个样板就失去了它的价值,如果需要其他样板只能重新雕刻。而活字印刷术的出现就大大改善了印刷技术。如上例”喝酒唱歌,人生真爽“,如果用活字印刷,只需要改四个字就可,其余工作都未白做。岂不快哉!!
活字印刷也反应了OOP。当要改动时,只需要修改部分,此为 可维护;当这些字用完后,并非就完全没有价值了,它完全可以在后来的印刷中重复使用,此乃 可复用;此诗若要加字,只需另刻字加入即可,这就是 可扩展;字的排列可以横排,也可以竖排,此是 灵活性好。
上述案列反应了OOP的优点,即可维护性高,扩展性强,复用性高! 这些特点非常适用于用户需求变化频繁的互联网应用程序,这是学习OOP的重要原因
但是OOP设计的程序需涉及类与对象,相应的复杂度会提高!
并非所有程序都需要较高的扩展性,例如系统内核,一旦编写完成,基本不会再修改,使用面向过程来设计则更适用
类和对象是面向对象编程中最核心的两个概念
对象是特征与技能的结合体
如:演员张一山,姓名和职业是他的特征,演戏是他的行为,按照这样的定义,生活中到处都是对象
在程序中:
用变量来表示对象的特征,用函数表示对象的技能
将这些变量和函数结合在一起,形成一个整体,就是对象,这是面向对象的精髓所在!
对象的另一种理解方式
变量的作用数存储数据,函数的作用数处理数据
对象是将数据与处理数据的函数绑定在一起
类就是类型,类别,种类; 是一系列对象中相似特征与技能的结合体
在生活中是一种抽象概念,例如人类,是不具体的
如某个对象属于人类,可以通过类别,了解这个对象具备的特征和技能
反过来看类就是对象的模板,同一类的对象,具备相同的特征和行为
现实生活中,通过对对象的分析总结,得到类型;用类型来标识不同对象之间的差异;
在程序中,同样用于标识不同对象之间的差异
另一个重要的功能是作为对象的模板,例如学生类,无论是哪个学生都具备学习这个方法,既然是相同的就没必要为每个对象单独编写,学生类负责提供这些相同的方法;
OOP第一步要做的就是定义需要的类
以学生类Student为例,在Python中,定义类通过class
关键字:
class Student:
pass
class
后面紧接着是类名,即Student
,遵循python编码规范,类名通常是大写开头的单词,多个单词时使用驼峰命名法
创建对象也称之为实例化,定义好Student
类后,就可以根据Student
类创建出Student
的实例,创建实例通过类名加上()实现:
stu1 = Student()
print(stu1)
#输出 <__main__.Student object at 0x10b11d588>
print(Student)
#输出 <class ‘__main__.Student‘>
根据输出可以看到
变量名stu1
指向一个Student
类的实例,0x10b11d588
是实例的内存地址,每个实例的地址都不相同,
Student
本身则是一个类(class)
对象是特征(属性)与行为(方法)的结合体
stu
这个对象目前不具备任属性和方法,要为其添加属性可以在创建对象后使用点语法(变量名加 . )
比如为stu
对象添加name属性
stu1.name = "Jerry"
同样通过点语法来获取对象的属性值
print(stu1.name)
#输出 Jerry
原文:https://www.cnblogs.com/haojunliancheng/p/10871461.html