对象和类
对象包含两种特征:
- 状态
- 行为
类:某种类型集合的描述。
属性:类本身的一些特性。
方法:类所能实现的行为。
类的定义
类的定义的语法
class classname[(父类名)]:
[成员函数及成员变量]
classname是这个类的名称,而父类名是可选的。但定义父类以后,子类则具有父类的相应属性和方法。
_init_
构造函数:初始化对象的各个属性_del_
析构函数:销毁对象
类的定义示例
创建一个student
类,每个student类型的对象都包含三个信息:
name
hours
qpoints
为了程序命名更加规范,将定义的参数与类内变量的名字相对应,构造函数接收float、int或string类型的参数。
在上述类的定义里,将hours
和qpoints
的类型强制转换成float
类型。
建立类的方法
面向对象的特点
- 封装
- 多态
- 继承
封装
- 抽象对象(我的理解是和形参类似的意思)
- 打包数据和操作(数据和操作放到一起)
- 对象的实现和使用相互独立
- 支持代码复用
比如下面的Projectile类:
- Projectile类封装了投射体的属性和方法
- 主程序不关心铅球内部实现
- Projectile类可以被多个程序和对象使用
###多态
- 对象怎么回应消息
- 同一函数名启用不同方法
比如一个图形对象列表:
- 列表包含Circle、Rectangle、Polygon
- 使用相同代码,画出列表所有的图形
下面这个代码在obj分别是Circle、Rectangle、Polygon时,执行Circle、Rectangle、Polygon的draw
方法。
for obj in objects:
obj.draw(win)
- 灵活性
继承
一个类(subclass)可以借用另一个类(superclass)的行为。
- 避免操作重复
- 提升代码复用程度(新类经常基于已存在的类)
比如员工信息系统:
- Employee类,包含员工的一般信息。比如有
homeAddress()
方法 - 子类正式员工SalariedEmployee、子类临时员工HourlyEmployee。二者作为Employee类的子类,二者可以继承
homeAddress()
方法
学生GPA计算的完整代码
计算铅球位置的示例
程序主函数
定义Projectile类
面向对象的程序化模块
要先引入Projectile类:
from Projectile import *