生成对象

生成对象

定义好了类这个模板之后,就可以根据Person类创建实例,过程类似于函数调用:

调用时,类名是一个函数,返回值是一个对象实例。

在类中,有这样一个函数__init__,它是一个初始化函数。我们可以这样理解,当我们使用PowerPoint、Word创建一个文档或者在游戏中创建一个人物时,这些具体的对象总有一些属性值,如白底黑字的Word文档,将人物初始化为一个20岁的青年等。

其中,__init__方法的第一个参数永远都是self,表示创建实例本身,在__init__方法内部,如self.name表示这个name值是属于实例本身的,即实例的属性,就像一个人总有年龄、身高等属性。而name则是外部输入的参数,用来给self.name赋值,就像在游戏中创建人物时在姓名框中输入值。

如果在__init__函数中,没有指定从属变量,对象可以自行创建属性值,而如果是有参数的__init__函数,则需要在创建实例对象时输入参数(self不用赋值,只需要输入两个参数),如GY=Person("关羽","男")。当然,还可以自行增加属性值,如GY.age=28,这是对象在原有模板基础上自行添加的,只属于该对象实例本身,其他由模板创建的实例并不含有此项。

属性值属于对象,如果要访问,必须指定对象,如打印关羽的年龄,键入命令print(GY.age)即可,此时读者可以将中间这个点(.)理解为“的”,即“关羽的年龄”。

这样看来,封装数据可以将一系列相关的变量绑定在一个对象上,但是对象如果只包含这些数据,则它还是不完美的。例如,我们想输出武将的信息,需要定义外部函数:

输出结果为:

这样看起来,类的作用就和一个列表或者字典差不多,似乎也没有什么优势。而现实世界中的对象都具备行动力,这些行动会对对象自身产生影响。例如,我们反复练习投篮,那么我们的投篮命中率就会提高。而这些行为和属性都是从属于一个对象的。因此,也应该将这些函数写在类的模板里,这样一来,每创建一个实例对象,这个对象就既具有属性,也具有方法。是否可以把函数方法也作为对象的一部分呢?答案是肯定的。