面向对象编程OOP(Object Oriented Programing)
一。为什么使用面向对象编程
- 使程序更加容易扩展和易更改,使开发效率变的更高
- 基于面向对象的程序可以使它人更加容易理解你的代码逻辑,从而使团队开发变得更从容。
二。面向对象编程介绍
名词解释:
类:一个类即是对一类拥有相同属性的对象的抽象、蓝图、原型、模板。在类中定义了这些对象的都具备的属性(variables(data))、共同的方法
属性:人类包含很多特征,把这些特征用程序来描述的话,叫做属性,比如年龄、身高、性别、姓名等都叫做属性,一个类中,可以有多个属性
方法:人类不止有身高、年龄、性别这些属性,还能做好多事情,比如说话、走路、吃饭等,相比较于属性是名词,说话、走路是动词,这些动词用程序来描述就叫做方法。
实例(对象):一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之前有共性,亦有不同
实例化:把一个类转变为一个对象的过程就叫实例化
面向对象3大特性
Encapsulation 封装
在类中对数据的赋值、内部调用对外部用户是透明的,这使类变成了一个胶囊或容器,里面包含着类的数据和方法
Inheritance 继承
一个类可以派生出子类,在这个父类里定义的属性、方法自动被子类继承
Polymorphism 多态
多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,指一个基类中派生出了不同的子类,且每个子类在继承了同样的方法名的同时又对父类的方法做了不同的实现,这就是同一种事物表现出的多种形态。
编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话。
对不同类的对象发出相同的消息将会有不同的行为。比如,你的老板让所有员工在九点钟开始工作, 他只要在九点钟的时候说:“开始工作”即可,而不需要对销售人员说:“开始销售工作”,对技术人员说:“开始技术工作”, 因为“员工”是一个抽象的事物, 只要是员工就可以开始工作,他知道这一点就行了。至于每个员工,当然会各司其职,做各自的工作。
多态允许将子类的对象当作父类的对象使用,某父类型的引用指向其子类型的对象,调用的方法是该子类型的方法。这里引用和调用方法的代码编译前就已经决定了,而引用所指向的对象可以在运行期间动态绑定
三。类,实例,属性,方法详解。
类的语法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
class Person(object): def __init__(self, name, age): self.name = name self.age = age p = Person("A", 22) print(p.name, p.age)
__init__()方法为构造方法,在初始化实例的时候使用。self为实例本身
类的方法
构造方法
刚才上面已经说了,主要作用是实例化时给实例一些初始化参数,或执行一些其它的初始化工作,总之,因为这个__init__只要一实例化,就会自动执行,so不管你在这个方法里写什么,它都会统统在实例化时执行一遍
普通方法
定义类的一些正常功能,比如人这个类, 可以说话、走路、吃饭等,每个方法其实想当于一个功能或动作
析构方法(解构方法)
实例在内存中被删除时,会自动执行这个方法,如你在内存里生成了一个人的实例,现在他被打死了,那这个人除了自己的实例要被删除外,可能它在实例外产生的一些痕迹也要清除掉,清除的动作就可以写在这个方法里
四。面向过程和面向对象的比较
面向过程的程序设计
概念:
核心是“过程”二字,“过程”指的是解决问题的步骤,即先干什么再干什么......,基于面向过程设计程序就好比在设计一条流水线,是一种机械式的思维方式。若程序一开始是要着手解决一个大的问题,面向过程的基本设计思路就是把这个大的问题分解成很多个小问题或子过程,这些子过程在执行的过程中继续分解,直到小问题足够简单到可以在一个小步骤范围内解决。
优点是:
复杂的问题流程化,进而简单化(一个复杂的问题,分成一个个小的步骤去实现,实现小的步骤将会非常简单)
举个典型的面向过程的例子, 写一个数据远程备份程序, 分三步,本地数据打包,上传至云服务器,测试备份文件可用性。
import os def data_backup(folder): print("找到备份目录: %s" %folder) print('正在备份......') zip_file='/tmp/backup20181103.zip' print('备份成功,备份文件为: %s' %zip_file) return zip_file def cloud_upload(file): print("\nconnecting cloud storage center...") print("cloud storage connected.") print("upload file...%s...to cloud..." %file) link='http://www.xxx.com/bak/%s' %os.path.basename(file) print('close connection.....') return link def data_backup_test(link): print("\n下载文件: %s , 验证文件是否无损" %link) def main(): #步骤一:本地数据打包 zip_file = data_backup("c:\\users\\alex\欧美100G高清无码") #步骤二:上传至云服务器 link=cloud_upload(zip_file) #步骤三:测试备份文件的可用性 data_backup_test(link) if __name__ == '__main__': main()
缺点是:
一套流水线或者流程就是用来解决一个问题,比如生产汽水的流水线无法生产汽车,即便是能,也得是大改,改一个组件,与其相关的组件都需要修改,牵一发而动全身,扩展性极差。
比如我们修改了步骤二的函数cloud_upload的逻辑,那么依赖于步骤二结果才能正常执行的步骤三的函数data_backup_test相关的逻辑也需要修改,这就造成了连锁反应,而这一弊端会随着程序的增大而变得越发的糟糕,我们程序的维护难度将会越来越大。
import os def data_backup(folder): print("找到备份目录: %s" %folder) print('正在备份......') zip_file='/tmp/backup20181103.zip' print('备份成功,备份文件为: %s' %zip_file) return zip_file def cloud_upload(file): #加上异常处理,在出现异常的情况下,没有link返回 try: print("\nconnecting cloud storage center...") print("cloud storage connected.") print("upload file...%s...to cloud..." % file) link = 'http://www.xxx.com/bak/%s' % os.path.basename(file) return link except Exception: print('upload error') finally: print('close connection.....') def data_backup_test(link): #加上对参数link的判断 if link: print("\n下载文件: %s , 验证文件是否无损" %link) else: print('\n链接不存在') def main(): #步骤一:本地数据打包 zip_file = data_backup("c:\\users\\alex\欧美100G高清无码") #步骤二:上传至云服务器 link=cloud_upload(zip_file) #步骤三:测试备份文件的可用性 data_backup_test(link) if __name__ == '__main__': main()
应用场景:
面向过程的程序设计思想一般用于那些功能一旦实现之后就很少需要改变的场景, 如果你只是写一些简单的脚本,去做一些一次性任务,用面向过程的方式是极好的,著名的例子有Linux內核,git,以及Apache HTTP Server等。但如果你要处理的任务是复杂的,且需要不断迭代和维护 的, 那还是用面向对象最方便了。
面向对象的程序设计
概念:
核心是“对象”二字,要理解对象为何物,必须把自己当成上帝,在上帝眼里,世间存在的万物皆为对象,不存在的也可以创造出来。程序员基于面向对象设计程序就好比如来设计西游记,如来要解决的问题是把经书传给东土大唐,如来并没有考虑问题的解决流程,而是设计出了负责取经的师傅四人:唐僧,沙和尚,猪八戒,孙悟空,负责骚扰的一群妖魔鬼怪,以及负责保驾护航的一众神仙,这些全都是对象,然后取经开始,就是师徒四人与妖魔鬼怪神仙交互着直到完成取经任务。所以说基于面向对象设计程序就好比在创造一个世界,世界是由一个个对象组成,而你就是这个世界的上帝。
我们从西游记中的任何一个人物对象都不难总结出:对象是特征与技能的结合体。比如孙悟空的特征是:毛脸雷公嘴,技能是:七十二变、火眼金睛等。
与面向过程机械式的思维方式形成鲜明对比,面向对象更加注重对现实世界而非流程的模拟,是一种“上帝式”的思维方式。
优点是:
解决了面向过程可扩展性低的问题,这一点我们将在5.2小节中为大家验证,需要强调的是,对于一个软件质量来说,面向对象的程序设计并不代表全部,面向对象的程序设计只是用来解决扩展性问题。
缺点是:
编程的复杂度远高于面向过程,不了解面向对象而立即上手并基于它设计程序,极容易出现过度设计的问题,而且在一些扩展性要求低的场景使用面向对象会徒增编程难度,比如管理linux系统的shell脚本程序就不适合用面向对象去设计,面向过程反而更加适合。
应用场景:
当然是应用于需求经常变化的软件中,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方。