面向对象⭐⭐
1. 面向对象和面向过程思想
面向对象和面向过程都是一种编程思想,就是解决问题的思路
- 面向过程:
POP(Procedure Oriented Programming)
面向过程语言代表是c语言 - 面向对象:
OOP(Object Oriented Programming)
常见的面向对象语言包括:java c++ go python koltin
通过面向对象的方式,我们不再关注具体的步骤,而是将问题抽象为对象和它们之间的交互。我们可以直接调用对象的方法来实现功能,而无需显式指定每个步骤。
面向过程强调按照步骤执行操作,而面向对象强调通过定义和操作对象来解决问题。
在面向对象的编程中,我们将问题抽象为对象的集合,这些对象具有属性和行为,并通过对象之间的交互来实现功能。这种抽象和交互的方式使得面向对象编程更加灵活、可维护和可扩展。
接下来我们看同一个问题,面向过程和面向对象是怎么解决的?
1.1. 面向过程编程的贪吃蛇游戏
在面向过程编程中,贪吃蛇游戏可能会以以下方式实现:
- 定义蛇的初始位置、长度、方向等变量。
- 创建一个表示游戏区域的二维数组。
- 在游戏循环中,根据用户输入改变蛇的方向。
- 更新蛇的位置,根据当前方向向前移动一格。
- 检查蛇是否吃到食物,如果是,则增加蛇的长度。
- 检查蛇是否撞到边界或自己的身体,如果是,则游戏结束。
- 在游戏区域中绘制蛇和食物。
- 循环回到第3步,直到游戏结束。
在面向过程的编程中,游戏的各个方面被划分为一系列的步骤和变量,通过按照特定顺序执行这些步骤来控制游戏的逻辑和状态。
1.2. 面向对象编程的贪吃蛇游戏
现在,让我们看看如何使用面向对象编程来实现贪吃蛇游戏。
- 创建一个
Snake
类,具有属性(例如位置、颜色、长度、方向)和方法(例如移动、吃食物)。 - 创建一个
Food
类,具有属性(例如位置、颜色)。 - 创建一个
Game
类,它包含一个或多个蛇对象和一个或多个食物对象,以及游戏区域等属性。Game类还具有控制游戏逻辑的方法,例如更新游戏状态和绘制游戏界面。 - 在游戏循环中,通过调用Game类的方法来控制游戏的进行,例如根据用户输入改变蛇的方向,更新蛇的位置,检查碰撞等。
- 在游戏界面中,通过调用绘图方法来绘制蛇和食物。
在面向对象编程中,贪吃蛇游戏被视为一组对象的交互。各个对象封装了游戏的状态和行为,并通过对象之间的消息传递来实现功能。这种对【对象Object】的抽象和交互使得游戏逻辑更清晰、可维护性更高,并且可以轻松地扩展和修改游戏的功能。
一切皆对象!
1.3. 面向对象的总结
- 面向对象,强调的是对象(实体)
- 面向对象是一种思想,更加符合人的思维习惯
- 面向对象使复杂的问题简单化了
- 面向对象的出现,让曾经在过程的执行者,变成了对象的指挥者
2. 类和对象
类和对象是面向对象非常重要的概念
- 类是描述了一种类型(相当于图纸)
- 对象是这个类型的具体实现(相当于图纸具体实现)
思考:
旺财和狗,哪个是类,哪个是对象?
答案:
狗是一个类型,属于类
旺财是狗的实现,属于对象
类和对象的关系
类就是制造图纸,只有一个。对象是类的实体,会产生多个
定义类和创建对象
类的定义格式:
class 类名:pass
创建对象
对象名 = 类名()
代码演示:
# 定义类
class Person:pass
# 创建对象
p1 = Person()
3. 类的组成
类可以描述世间万物,类都需要有类名,也应该具备一些属性和行为
- 类的关键字:
class
- 类的名称:类名
- 类的属性:一组数据
- 类的方法:允许进行操作的方法(行为)
人(Person)类应该具备什么属性和行为呢?
- 属性:姓名(
name
) 、年纪(age
) - 方法:吃(
eat
)、跑(run
)、说话(say
)
3.1. 成员属性
成员属性的定义需要在初始化方法__init__
方法下定义
格式:
def __init__(self):self.属性 = 属性值
举例:
class Person:def __init__(self, name, age):# 成员属性self.name = nameself.age = age# 创建对象
p = Person('张三', 30)
# 访问成员属性
print(p.name)
print(p.age)
在创建对象时,属性值可以由外部传进来,也可以在初始化方法里设置为任意值
3.2. 成员方法
成员方法的定义格式为 def 函数名(self):
class Person:# 定义成员方法 say_hellodef say_hello(self):print('hello')# 定义成员方法rundef run(self):print('跑')# 创建对象
p = Person()
# 调用成员方法
p.say_hello()
注意:
成员方法都会默认有参数self
,调用的时候不需要传递self