Skip to content

类与对象

类型(汉语词语),指包含由各特殊的事物或现象抽出来的共通点的抽象概念;

类(Class)是面向对象程序设计(OOP,Object-Oriented Programming)实现信息封装的基础。

面向对象

面向对象编程 —— Object Oriented Programming 简写 OOP

对象到底是什么,我们可以从两次层次来理解。

(1) 对象是单个事物的抽象

一本书、一辆汽车、一个人都可以是对象,一个数据库、一张网页、一个与远程服务器的连接也可以是对象。当实物被抽象成对象,实物之间的关系就变成了对象之间的关系,从而就可以模拟现实情况,针对对象进行编程。

例如,一个“人”对象可以表示具有姓名,年龄,身高、体重等属性,具有吃饭,睡觉,呼吸和跑步等行为。

换句话说,面向对象编程是将现实世界的事物在程序中建立模型的关系方法,如现实世界地形与导航软件中的地形,现实世界中购物常见与电商软件的购物场景,现实世界中的看房与网站上的在线看房。

(2) 对象是一个容器,封装了属性(property)和方法(method)

属性是对象的状态,方法是对象的行为(完成某种任务)。

比如,我们可以把动物抽象为 Animal 类,使用“属性”记录具体是那一种动物,使用“方法”表示动物的某种行为(奔跑、捕猎、休息等等)。

在实际开发中,对象是一个抽象的概念,可以将其简单理解为:数据集或功能集。

提示:每个对象都是基于一个引用类型创建的,这些类型可以是系统内置的原生类型,也可以是开发人员自定义的类型。

面向对象编程

面向对象编程(Object-oriented Programming,简称 OOP )是一种编程范例 ,它提供了一种结构化程序的方法,以便将属性和行为捆绑到单个对象中。

OOP 将现实世界的实体建模为软件对象,一些与之相关的数据,可以执行某些功能。

面向对象  
    类: 是一类事物抽象概念的总称  
    对象: 类里面的具体某一个事物  
  
    类 --> 人  
    对象 --> 正心(人类)

在面向对象程序开发思想中,每一个对象都是功能中心,具有明确分工,可以完成接受信息、处理数据、发出信息等任务。

因此,面向对象编程具有灵活、代码可复用、高度模块化等特点,容易维护和开发,比起由一系列函数或指令组成的传统的过程式编程(procedural programming),更适合多人合作的大型软件项目。

面向对象与面向过程的区别:

  • 面向过程就是亲力亲为,事无巨细,面面俱到,步步紧跟,有条不紊
  • 面向对象就是找一个对象,指挥得结果
  • 面向对象将执行者转变成指挥者
  • 面向对象不是面向过程的替代,而是面向过程的封装

面向对象的特性:

  • 封装性
  • 继承性
  • 多态性

扩展阅读:

提示

面向对象编程不是新的东西,它只是过程式代码的一种高度封装,目的在于提高代码的开发效率和可维护性。

面向对象的具体表现

在 Python 中,所有数据类型都可以视为对象,当然也可以自定义对象。 自定义的对象数据类型就是面向对象中的类( Class )的概念。

我们以一个例子来说明面向过程和面向对象在程序流程上的不同之处。

面向过程写法

假设我们要处理学生的成绩表,为了表示一个学生的成绩,面向过程的程序可以先用一个字典对象表示学生:

python
std1 = {'name': '小明', 'score': 98}
std2 = {'name': '小红', 'score': 81}

而处理学生成绩可以通过函数实现,比如打印学生的成绩时需要封装一个打印函数,在函数内部处理打印逻辑:

python
def print_score(student):
    print('姓名:' + student['name'] + '  ' + '成绩:' + str(student['score']))


print_score(std1)
print_score(std2)

最后调用函数,传入学生对象,打印成绩。

面向对象写法

如果采用面向对象的程序设计思想,我们首选思考的不是程序的执行流程, 而是 Student 这种数据类型应该被视为一个对象,这个对象拥有 namescore 这两个属性(Property)。

如果要打印一个学生的成绩,首先必须创建出这个学生对应的对象,然后,给对象发一个 print_socre 消息,让对象自己把自己的数据打印出来。

抽象数据行为模板(Class):

python
# 将 "学生" 这个类的概念全部抽象出来  
class Student:  # 类的名字用大驼峰命名法  
    def __init__(self, name, score):
        # 初始化函数 也是一个普通函数,只是有特殊的功能  
        self.name = name  # 将实例属性绑定到对象上  
        self.score = score

    def print_score(self):
        print('姓名:' + self.name + '  ' + '成绩:' + str(self.score))

根据模板创建具体实例对象(Instance):

python
# 类对象名字 + () 调用类对象创建实例对象 --> __init__# 实例化对象, 传入对象的属性  
# 一个类的对象封装好后, 可以实例化多个对象  
person1 = Student('小明', 98)
person2 = Student('小红', 81)

实例对象具有自己的具体行为(给对象发消息):

python
# 根据实例化的对象调用对象的属性  
print('姓名:\t', person1.name)
print('分数:\t', person1.score)

# 根据实例化的对象, 调用对象的方法
person1.print_score()  # => 姓名:小明  成绩:98
person1.print_score()  # => 姓名:小红  成绩:81

面向对象的设计思想是从自然界中来的,因为在自然界中,类(Class)和实例(Instance)的概念是很自然的。

Class 是一种抽象概念,比如我们定义的 Class —— Student ,是指学生这个概念, 而实例(Instance)则是一个个具体的 Student ,比如, 小明 和 小红 是两个具体的 Student 。

所以,面向对象的设计思想是:

  1. 抽象出 Class(类模板)
  2. 根据 Class(类模板) 创建 Instance(实例对象)
  3. 指挥 Instance 得结果

面向对象的抽象程度又比函数要高,因为一个 Class 既包含数据,又包含操作数据的方法。