1、面向对象编程思想
面向对象是一种符合人类思维习惯的编程思想。现实生活中存在各种形态不同的事物,这些事物之间存在着各种各样的联系。在程序中使用对象来映射现实中的事物,使用对象的关系来描述事物之间的联系,这种思想就是面向对象。
面向过程与面向对象编程思想对比:
面向过程:• 分析出解决问题所需要的步骤• 使用函数实现每个步骤的功能• 按步骤依次调用函数
面向对象:• 分析问题,从中提炼出多个对象• 将不同对象各自的特征和行为进行封装• 通过控制对象的行为来解决问题。
面向过程思想实现五子棋编程:
面向过程:
(1)开始游戏。
(2)绘制棋盘画面。
(3)落黑子。
(4)绘制棋盘落子画面。
(5)判断输赢。
(6)落白子。
(7)绘制棋盘落子画面。
(8)判断输赢:赢则结束游戏,否则返回步骤。
image.png
三个对象:(1)玩家:黑白双方,负责决定落子的位置。(2)棋盘:负责绘制当前游戏的画面,向玩家反馈棋盘的状况。
(3)规则系统:负责判断游戏的输赢。
image.png
2、类与对象
面向对象编程有两个非常重要的概念:类和对象。
对象映射现实中真实存在的事物。具有相同特征和行为的事物的集合统称为类。对象是根据类创建的,一个类可以对应多个对象。类是对象的抽象,对象是类的实例。
类是由3部分组成的:
• 类的名称:大驼峰命名法,首字母一般大写,比如Person。
• 类的属性:用于描述事物的特征,比如性别。
• 类的方法:用于描述事物的行为,比如抬腿
image.png
image.png
3、类的属性与方法
属性按声明的方式可以分为两类:类属性和实例属性。
1)类属性
• 声明在类内部、方法外部的属性。
• 可以通过类或对象进行访问,但只能通过类进行修改。
2)实例属性
• 实例属性是在方法内部声明的属性。
• 访问实例属性——只能通过对象访问
• 修改实例属性——通过对象修改
• 动态添加实例属性——类外部使用对象动态添加实例属性
类的方法按定义方式和用途可以分为三类:实例方法、类方法和静态方法。
1)实例方法
• 形似函数,但它定义在类内部。
• 以self为第一个形参,self参数代表对象本身
• 只能通过对象调用
2)类方法
• 类方法是定义在类内部
• 使用装饰器@classmethod修饰的方法
• 第一个参数为cls,代表类本身
• 可以通过类和对象调用
3) 静态方法
• 静态方法是定义在类内部
• 使用装饰器@staticmethod修饰的方法
• 没有任何默认参数
• 静态方法可以通过类和对象调用
公有成员与私有成员:
类的成员默认是公有成员,可以在类的外部通过类或对象随意地访问,这样显然不够安全。
为了保证类中数据的安全,Python支持将公有成员改为私有成员,在一定程度上限制在类的外部对类成员的访问。
Python通过在类成员的名称前面添加双下画线(__)的方式来表示私有成员,语法格式如下:
__属性名
__方法名
私有成员在类的内部可以直接访问,在类的外部不能直接访问,但可以通过调用类的公有成员方法的方式进行访问。
4、构造与析构方法
• 构造方法指的是__init__()方法。
• 创建对象时系统自动调用,从而实现对象的初始化。
• 每个类默认都有一个__init__()方法,可以在类中显式定义
__init__()方法。
• __init__()方法可以分为无参构造方法和有参构造方法。
a. 当使用无参构造方法创建对象时,所有对象的属性都有相同的初始值。
b. 当使用有参构造方法创建对象时,对象的属性可以有不同的初始值。
• 析构方法(即__del__()方法)是销毁对象时系统自动调用的方法。
• 每个类默认都有一个__del__()方法,也可以显式定义析构方法。
5、封装
封装是面向对象的重要特性之一,它的基本思想是对外隐藏类的细节,提供用于访问类成员的公开接口。
如此,类的外部无需知道类的实现细节,只需要使用公开接口便可访问类的内容,这在一定程度上保证了类内数据的安全。
为了实现封装思想,我们在定义类时需要满足以下两点要求。
1)将类属性声明为私有属性。
2)添加两类供外界调用的公有方法,分别用于设置或获取私有属性的值。
6、继承
继承是面向对象的重要特性之一,它主要用于描述类与类之间的关系,在不改变原有类的基础上扩展原有类的功能。
若类与类之间具有继承关系,被继承的类称为父类或基类,继承其他类的类称为子类或派生类,子类会自动拥有父类的公有成员。
单继承即子类只继承一个父类。现实生活中,波斯猫、折耳猫、短毛猫都属于猫类,它们之间存在的继承关系即为单继承,如图所示。、
Python中单继承的语法格式如下所示:
image.png
class 子类名(父类名):
• 子类继承父类的同时会自动拥有父类的公有成员。
• 自定义类默认继承基类object。
程序中的一个类也可以继承多个类,如此子类具有多个父类,也自动拥有所有父类的公有成员。
image.png
Python中多继承的语法格式如下所示:
class 子类名(父类名1, 父类名2, ...)