面向对象编程简介
面向对象程序设计(Object Oriented Programming,OOP)是一种计算机编程架构。
OOP的一条基本原则是计算机程序由单个能够起到子程序作用的单元或对象组合而成。
OOP达到了软件工程的三个主要目标:重用性、灵活性和扩展性。
OOP = 对象 + 类 + 继承 + 多态 + 消息,其中核心概念是 类 和 对象 。
面向对象程序设计方法是尽可能模拟人类的思维方式,以对象为核心,认为程序由一系列对象组成。
类 class
类,其实就是面向对象的意思!
类的定义:
可以简单地看作是数据以及由存取、操作这些数据的方法所组成的一个集合。类是对现实世界中一些事物的封装。
类的优点:
- 类对象是多态的。具有多种形态,我们可以对不同的类对象使用同样的操作方法,而不需要额外编写代码。
- 类的封装。类封装后,可以直接调用类的对象来操作内部的一些类方法,不需要让使用者看到代码工作的细节。
- 类的继承。类可以从其他类或者基类中继承它们的方法,直接使用。
面向对象 和 面向过程 程序设计的区别
面向对象的程序设计:
- 把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。
- 总的来说面向对象是将事物高度抽象化,面向对象必须先建立抽象模型,之后直接使用模型就行了
- 面向对象的抽象程度比函数要高,因为一个Class既包含数据,又包含操作数据的方法。
面向过程的程序设计:
- 把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。
- 面向过程是一种自顶向下的编程
通俗地理解就是:
面向对象就是将编程当成是一个事物,对外界来说,事物是直接使用的,不用去管他内部的情况。
在面向对象编程中,可以编写用来表示现实世界中的事物和情景的类,并基于这些类来创建对象。编写类时,可以定义这一大类的对象都有的通用行为。基于类创建对象时,每个对象都自动具备这种通用行为,然后可以根据需要赋予每个对象独特的个性。
对于一个Dog 类,面向对象只需要让用户找到一条小狗,然后对小狗发出打滚或者坐下的指令就可以了,至于小狗要怎么打滚或者坐下,用户是不用知道的。
(1)首先创建一个 Dog 类(不需要用户做的)
class Dog:
"""一次模拟小狗的尝试"""
def __init__(self, name, age):
"""初始化小狗的属性"""
self.name = name
self.age = age
def roll(self):
"""模拟小狗打滚"""
print(f"{self.name.title()} is rolling!")
def sit(self):
"""模拟小狗坐下"""
print(f"{self.name.title()} is now sitting!")
(2)根据类创建实例,并调用方法(用户唯一要做的)
one = Dog('willie',2)
one.roll()
one.sit()
(3)输出结果(可以看出它按照我们的命令做了!)
Willie is rolling!
Willie is now sitting!
面向过程就是将编程当成是做一件事,要按步骤完成,每一步就是一个过程。
面向过程的重心就在过程二字,把一个大问题拆分成很多个小问题,然后依次执行每个小问题,这是一种流水线的、从上而下的过程。
比如用户想要命令小狗,就不能直接发出指令,而需要自己执行打滚和坐下的函数,才能发出指令。
def roll(name):
"""模拟小狗打滚"""
print(f"{name.title()} is rolling!")
def sit(self):
"""模拟小狗坐下"""
print(f"{name.title()} is now sitting!")
name = 'willie'
roll(name)
sit(name)
输出结果:
Willie is rolling!
Willie is now sitting!
比较二者:
面向过程编程:
- 优点:编程思路清晰
- 缺点:代码迁移性差,可复用性低。例如如果我还需要写一个命令小猫的类似的程序,面向过程编程可能需要修改很多代码,但面向对象编程可以做到事半功倍。
面向过程编程:
一般用于那些功能一旦实现之后就很少需要改变的场景, 如果你只是写一些简单的脚本,去做一些一次性任务,用面向过程去实现是极好的,但如果你要处理的任务是复杂的,且需要不断迭代和维护, 那还是用面向对象最为方便。
面向对象编程特点
封装性
封装是指将一个计算机系统中的数据以及与这个数据相关的一切操作语言(即描述每一个对象的属性以及其行为的程序代码)组装到一起,一并封装在一个有机的实体中,把它们封装在一个“模块”中,也就是一个类中,为软件结构的相关部件所具有的模块性提供良好的基础。
封装的最基本单位是对象。
对于用户来说,对象是如何对各种行为进行操作、运行、实现等细节是不需要刨根问底了解清楚的,用户只需要通过封装外的通道对计算机进行相关方面的操作即可。大大地简化了操作的步骤,使用户使用起计算机来更加高效、更加得心应手。
继承性
继承性是面向对象技术中的另外一个重要特点,其主要指的是两种或者两种以上的类之间的联系与区别。
继承,顾名思义,是后者延续前者的某些方面的特点,而在面向对象技术则是指一个对象针对于另一个对象的某些独有的特点、能力进行复制或者延续。如果按照继承源进行划分,则可以分为单继承(一个对象仅仅从另外一个对象中继承其相应的特点)与多继承(一个对象可以同时从另外两个或者两个以上的对象中继承所需要的特点与能力,并且不会发生冲突等现象);如果从继承中包含的内容进行划分,则继承可以分为四类,分别为取代继承(一个对象在继承另一个对象的能力与特点之后将父对象进行取代)、包含继承(一个对象在将另一个对象的能力与特点进行完全的继承之后,又继承了其他对象所包含的相应内容,结果导致这个对象所具有的能力与特点大于等于父对象,实现了对于父对象的包含)、受限继承、特化继承。
多态性
从宏观的角度来讲,多态性是指在面向对象技术中,当不同的多个对象同时接收到同一个完全相同的消息之后,所表现出来的动作是各不相同的,具有多种形态;
从微观的角度来讲,多态性是指在一组对象的一个类中,面向对象技术可以使用相同的调用方式来对相同的函数名进行调用,即便这若干个具有相同函数名的函数所表示的函数是不同的。
参考文章:
https://blog.youkuaiyun.com/qq_27782503/article/details/93722779
https://blog.youkuaiyun.com/weixin_43507744/article/details/126579129