AI速成课:从AI编程到构建智能软件
上QQ阅读APP看书,第一时间看更新

3.7 类和对象

类(class),类似函数,是位于主体代码外的另一部分代码,只有当在主体代码中被调用时才开始执行。对象(object)是其所对应的类的实例(instance),存在于主体代码中。为了更好地理解类,可以把类想成一个蓝图,例如,汽车的蓝图。它包含了汽车某些零部件的外观以及怎样与别的零部件协同工作的信息。Python中的类就是像这样的关于某些东西的蓝图。

你可以把对象看作基于蓝图构建出的实际的东西。例如一个真实的、可以工作的无人驾驶汽车就是一个对象的例子。一般你会先创造出车的蓝图(这就是类),然后基于蓝图构建一辆车(这就是对象)。当然,如果你有了一个东西的蓝图,你就可以不停地基于同一蓝图造车,比如说,你可以建造一条生产线用于批量生产汽车。

为了让你对类的概念理解得更加深入,我们来创建一个简单的机器人的示例。可以像这样创建一个类:

我们使用class关键词表明正在创建一个新的名为Bot的类。接下来,至关重要的一步是编写__init__()方法,这一步在创建类时是不可或缺的。只要这个类的一个对象在主体代码中被创建出来,这个函数就会自动被调用。

类里面的所有函数都需要将self作为一个参数。那么,self是什么呢?self参数指明了这个函数和函数中以self为开始的变量都属于这个类的实例,也就是对象。一旦有了类的对象,我们就可以使用self中的变量。本例中Bot类的__init__()方法还使用了另外两个参数,posx和posy,这是我们即将创建的机器人的初始位置。

我们还创建了一个通过增减posx和posy来使机器人移动的方法(method)。“方法”指的是嵌套在类里面的函数。你可以把它看作蓝图中决定事物该如何运作的指令。例如,我们再次回到汽车的案例,方法可以定义引擎或者变速箱运作的方式。

现在,你可以创建这个类的一个对象了。记住,它是基于蓝图(类)构建出的实际的东西。

之前,类虽然被定义了,但是不会随着别的代码的运行而执行。在你创建了一个对象之后,类就变为主体代码中的一个组成部分。我们可以通过这样做来实现它:

这样做会创建Bot类的一个新对象,我们将这一新对象命名为bot。在创建时,我们必须指明Bot类中__init__()方法须要纳入的两个参数posx和posy。这是必填的。当创建一个对象时,你通常必须得声明__init__()方法中定义的所有参数。

现在,在主体代码中,你可以移动机器人并且显示它的新位置,像这样:

在第一行代码中,我们使用了Bot类中的move方法。你可以从它的定义看出,move采用了两个变量。这两个变量分别表明了posx和posy将要增加多少。然后我们仅仅显示了新的posx和posy的值。这里正是是self发挥作用的地方,如果Bot类中变量posx和posy之前没有加self,我们就不能在print()方法获取到这两个参数。运行这一代码会得到以下结果:

你可以从结果中看出,我们的机器人在x轴方向向前移动了两个单位并且在y轴方向向后移动了一个单位。别忘了posx的初始位置为3,现在通过Bot类中的move方法增加了2;posy初始位置为4,而现在通过同样的move方法增加了1。

花时间来写Bot类的一大好处就是,我们现在可以创建任意数量的Bot类对象,而不用重复写类中已经定义好的代码。简单地说,对象是类的实体,我们可以用类创建任意数量的对象。总的来说,你可以把类看作一些预定义指令和封装在类里面的方法的合集,可以把对象想成这个类的一个实例,它在我们的代码中是可访问的,并且与代码一同运行。

练习

你的终极挑战是创建一个非常简单的汽车的类。关于参数,汽车的对象应该将汽车所能移动的最大速度(单位为m/s)以及汽车在加速过程中的加速度(单位为m/s2)纳入其中。我再增加一点挑战,即创建一个方法用来计算汽车从当前速度加速到最大速度所花费的时间,加速度已知(使用当前速度作为这个方法的参数)。

提示:要计算所需要的时间,你可以使用以下公式。

其中:

·t——达到最大速度所需要的时间

·Vmax——最大速度

·Vcurrent——当前速度

·a——加速度

本练习的答案可以在GitHub页面的Chapter 03/Classes/homework.py文件中找到。