可能大家会听过这么一句话:“在 Python 中,一切皆对象。” 实际上前面接触的所有数据类型(如数字、字符串、列表、元组、字典、集合等)本质上都是对象。在本章中,你将学会如何定义一个类,然后通过这个类来创建一个对象。
有小伙伴们就会问:“自定义一个对象好像很酷,但它们能被用来干什么呢?到现在为止,我们已经有列表、元组、字符串、字典等对象可以用了,难道它们还不够用吗?” 确实还不够用,等你学完这一章心里就有答案了。
Python 面向对象是什么?
面向对象这个名词,大家在其他地方或多或少都有听说过。实际上,Python 本身就是一门面向对象编程的语言。面向对象是一种编程思想,那怎样才算是面向对象呢?在理解什么是 “对象” 之前,我们先来了解一下类是什么。类和对象,这两个是面向对象中最基本也是最重要的概念。
拿现实生活中的例子来说,像我们人类(如下图所示)就是一个 “类”,每个人就是一个 “对象”。类是总体,对象是个体。对于 “人” 这个类来说,具有以下的特点。
- 人的属性:有五官、有双手、有双腿等。
- 人的方法:会直立行走、会使用工具、会用语言交流等。

拿游戏开发中的例子来说,在《DOTA》(如下图所示)中,所有英雄就是一个 “类”,每一个英雄就是一个 “对象”。对于 “英雄” 这个类来说,具有以下的特点。
- 英雄的属性:有类型、有装备、有生命值、有魔法值等。
- 英雄的方法:可以发动物理攻击、可以发动法术攻击等。

想要使用 Python 来开发一个类似 DOTA 的游戏,如果使用面向过程的方式,那么对于每一个英雄来说,我们都要定义一遍它们的属性和方法。有多少个英雄,就要定义多少次。从这一点可以看出,面向过程这种方式的重复工作量是非常大的。
但是如果使用面向对象的方式,就变得非常简单了。面向对象,其实就是抽象出相同的属性和方法(方法,也叫做行为),然后把这些属性和方法封装到一个 “类” 中。以后每一个 “对象” 只需要继承这个 “类” 的属性和方法就可以了,而不需要重复性地去定义。实际上,“物以类聚,人以群分。” 这句话就有面向对象的味道在里面。
面向对象,说白了就是让软件世界更像现实世界。它是对现实世界的一种模仿,用类和对象来描述。实际上,大多数编程语言(包括 Python、Java、C++ 等)都有面向对象的概念。
Python 面向对象的核心特性
在 Python 中,面向对象编程主要围绕以下 3 个核心特性展开。
1. 封装(Encapsulation)
封装,指的是将数据(属性)和操作数据的方法(行为)捆绑在一起,形成一个独立的单元(类)。同时,隐藏对象的内部实现细节,只暴露必要的接口给外部。
封装通过类定义、实例属性和方法来实现。Python 没有严格的访问修饰符(如 public, private),但约定使用单下划线 “_” 表示受保护成员,双下划线 “__” 表示私有成员(会进行名称修饰)。
2. 继承(Inheritance)
继承,指的是允许一个类(子类 / 派生类)从另一个类(父类 / 基类)继承属性和方法。子类可以复用父类的代码,并可以添加自己的新功能或重写父类的方法。
其中,继承是通过在子类定义时,在括号中指定父类来完成。
3. 多态(Polymorphism)
多态,指的是同一个方法在不同的对象上,可能会有不同的行为。简单来说,就是:一个接口,多种实现。
在 Python 中,由于其动态类型特性,多态是自然实现的。只要不同的类(通常是继承自同一个基类)拥有相同的方法名,就可以表现出多态性。
在接下来的章节中,我们会详细介绍 Python 面向对象的相关概念以及用法,主要包括:
