一、类的继承和重写
1.类的继承
1.1默认继承Object类
类可以实现复杂的功能,而复杂的功能往往意味着比较复杂的代码结构。如果每次定义一个类时都需要从头构建,则会花费大量的且无意义的时间和精力。因此,Python中允许一个类继承另一个类的所有方法和属性(这里暂且这样说,关于类属性、实例属性、私有属性和半私有属性的概念后面再详细进行说明),而构建类所不可缺少的方法,全部被定义在基类(或元类)Object中。在Python3中,自定义的类会默认继承Object类,因此作为开发人员只需要在Object类的基础上添加自己想要实现的功能即可,而不用去管类的底层代码是如何实现的,大大缩短了开发时间,精简代码。 下图所示为自定义的TempClass继承了Object类,并实现了print_out()方法。
1.2自定义继承类
有时候我们并不想继承Object类,而是想继承自定义的类。比如前面说的,我们自定义了一个手机类Phone,但是这个手机类实现的功能过于简单,我们想让这个手机实现更加复杂的功能。于是,我们可以构建一个新的手机类NewPhone,这个新类会继承原手机类Phone并添加自己新的功能。如下:
2.类的重写
所谓的重写,是指从父类继承的方法不能满足子类的需求,需要对其进行改写。也就是将父类中的同名方法进行重写。重写的实现手段有两种:一种是完全重写,即从头实现一个与父类中同名的方法;另一种是继承重写,即在从父类中继承该方法的前提下进行修改。还是以手机类作为例子进行说明:
二、类对象和类的实例对象
从前面的代码中不难发现其中self出现频率很高,那么它到底是什么作用呢?其实,self指的是类的实例对象本身,那么什么是实例对象呢?它和类对象有什么区别和联系呢?
为了方便理解,以玩具成产为例:加工厂生产玩具,那么首先得生产模具,然后通过模具复制出很多粗胚,对粗胚进行上色等加工处理得到最后的成品玩具。这里的模具就相当于Python中的类对象,而通过模具生产出的成品玩具就相当于Python中的实例对象,而这个复制、上色加工的过程,就相当于Python中类的实例化过程,也即上面的my_phone = NewPhone('blue', 'Huawei', '2300¥')语句。在这里,NewPhone是类对象,而my_phone就是NewPhone类的实例对象。
对于类对象而言,self是未激活的,也即所有含有self的语句或以self作为参数的方法均是无效的;而self是实例对象本身,因此,在实例对象中self被激活,self中就包含了该实例对象区别于其他实例对象的所有信息。就如在玩具生产过程中的不同处理会得到不同的玩具一样,同一个类的不同实例之间具有差异性,这一差异性,体现在self中所包含信息的不同。需要指出的是self 这个词不是指定的关键字,换成符合Python变量命名的任意名称均可,但一般默认使用self。
