1
Python编程从入门到实践
1.12.1.1 8.1.1 类的创建
8.1.1 类的创建

以买计算机的操作为例,有两种方式可以选择:

第一种方式强调的是步骤、过程,每一步都是自己亲自去实现的,这种解决问题的思路就叫作面向过程。它是根据业务逻辑从上到下编写代码。

第二种方式强调的是雇用计算机高手。计算机高手是处理这件事的主角,对用户而言,用户不必亲自实现整个步骤,只需要利用计算机高手就可以解决问题。这种解决问题的思路就是面向对象。用面向对象的思维解决问题的重点,它是将数据与函数绑定到一起进行封装,这样能够更快速地开发程序,减少重复代码的重写过程。

面向过程编程最易被初学者接受,其往往用一长段代码来实现指定功能。开发过程的思路是将数据与函数按照执行的逻辑顺序组织在一起,数据与函数分开考虑。

面向对象和面向过程都是解决问题的一种思路而已。

面向对象编程(Object Oriented Programming,OOP)也就是面向对象程序设计。按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的办法。这种方法把软件系统中相近或相似的操作逻辑和操作应用数据、状态,以类的形式描述出来,以对象实例的形式在软件系统中复用,以达到提高软件开发效率的作用。

【例8.1】类的定义和实例化示例。

定义人的类Person,人有名字(name)、性别(gender)、体重(weight)等属性,根据这个说明,可以定义Person类并创建Person对象,代码如下。

运行结果如图8-1所示。

图8-1 运行结果

在以上代码中,代码块1定义了Person类,说明如下。

①class是定义类的关键字,Person是类名。在Python中定义类的格式是“class类名”,这是一个固定格式。

②这个类中只有一个函数,类中的函数也称为“方法”,该方法的名称为__init__,前面学到的有关函数的一切都适用于方法,唯一重要的差别是调用方法的方式。__init__()不是普通方法,是特殊的方法,其作用是:每当根据Person类创建新实例时,Python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在与普通方法区分。

③在__init__()方法的定义中,形参self必不可少,还必须位于其他形参的前面。为何必须在方法定义中包含形参self呢?因为Python调用__init__()方法来创建Person实例时,将自动传入实参self,每个与类相关联的方法调用都自动传递实参self,让实例能够访问类中的属性和方法。创建Person实例时,Python将调用Person类的方法__init__(),self会自动传递,因此不需要传递它。

④__init__()方法中有3条赋值语句,定义了3个变量name、gender和weight,这3个变量都有前缀self。以self为前缀的变量都可供类中的所有方法使用,还可以通过类的任何实例来访问这些变量。self.name='项羽'将变量name赋值为“项羽”,然后该变量被关联到当前创建的实例。self.gender='男'和self.weight='70'的作用与此类似。像这样带有前缀self、可通过实例访问的变量称为属性。

⑤__init__()方法的最后一条语句输出一句话。

代码块2紧接在类Person的定义语句后面,是使用类Person创建对象的代码,创建了两个名为p1和p2的Person对象,也称为Person实例。代码块2的解释如下。

①使用Person创建一个对象,并赋值给p1对象变量。p1是这个对象的对象名,在创建对象时自动调用Person类的方法。

②使用“.”号访问p1的属性,包括name、gender、weight。“.”符号是访问对象的属性和方法的特殊符号。

我们发现:

①输出了一次An instance created,这是因为创建一个Person对象,自动调用一次__init__()方法。

②输出了“项羽” “男” “70”,这是因为p1的name、gender、weight是在__init__()方法中赋值的。

面向对象编程有两个非常重要的概念:类和对象,如图8-2所示。

图8-2 类和对象

现实世界中的任何事件都可以称为对象,对象是构成世界的一个独立单位,例如,能运送人或货物的“运输工具”有飞机、轮船、火车、卡车、轿车等,这些都是对象。把众多的事物归纳、划分成一些类是人类在认识客观世界时经常采用的思维方法。

把具有共同性质的事物划分为一类,得出一个抽象的概念。例如,汽车、车辆、运输工具等都是一些抽象概念,它们是一些具有共同特征的事件的集合,被称为类。

在面向对象编程中,对象是面向对象编程的核心。在使用对象的过程中,和认识客观事物一样,为了将具有共同特征和行为的一组对象抽象定义,提出了类的概念。

类是抽象的,在使用的时候通常会找到这个类的一个具体的存在,然后再使用这个具体的存在。一个类可以有多个对象。类是用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。

人类在设计事物时,主要包括以下3个方面:

事物名称:如人。

事物的属性:如人的身高、体重、年龄等。

事物的方法(行为/功能):如人学习、工作等。

根据人类设计事物的特点,对类也做了定义。类由以下3个部分构成:

类的名称:类名。

类的属性:一组静态的数据。

类的方法:类能够进行操作的方法(行为)。

类是一种数据结构,是现实世界中实体的集合,在程序设计中以编程形式出现。类属性使用类名称访问,访问方式如下:

类名.属性

类属性是与类绑定的。如果要修改类的属性,必须使用类名访问它,此时不能使用对象实例访问(通过对象实例访问将在8.3节中进行介绍),如例8.2所示。

【例8.2】类属性访问实例。

以上实例输出结果如图8-3所示。

图8-3 输出结果

在Python中,没有public和private这些关键字来区别公有属性和私有属性。Python使用属性命名方式来区分公有属性和私有属性。之前所定义的name属性是公有属性,可以直接在类外面进行访问。如果定义的属性不想被外部访问,则需要将它定义成私有的,私有属性需在前面加两个下划线。类的方法也一样,方法前加了两个下划线符号表示私有,否则就表示公有,如例8.3所示。

【例8.3】类私有属性操作实例。

以上实例输出结果错误,提示如图8-4所示。

图8-4 输出结果

程序运行报错,提示找不到_name属性。因为_name是私有属性。私有属性不能在类外通过对象名来访问。

在Python中,有一些特殊的属性定义,主要是内置类属性。

内置类属性包括以下几种。

__dict__:类的属性(包含一个字典,由类的数据属性组成)。

__doc__:类的文档字符串。

__name__:类名。

__module__:类定义所在的模块(类的全名是“__main__.className”。如果类位于导入模块mymod中,那么className__module__等于mymod)。

__bases__:类的所有父类构成元素(包含了由所有父类组成的元组)。