上一篇文章,我们介绍了什么是面向对象、以及面向对象和面向过程的区别,最后我们写了案例来简单的介绍一下类class
,包括 如何创建一个类,类的构造函数__init__()
和析构函数__del__()
的意义,以及将类变量设置为私有变量。如果你还没有看过该文章,建议你先看下,以便做到承上启下。
本篇文章,将通过实例的方式,简单介绍一下继承和多态。
继承
在面向对象中,继承是最常见的代码复用技术,它允许我们从一个类派生出一个新的类,并且新的类继承父类的属性和方法,我们将其称之为继承。
在python
中,我们还是使用class
来定义一个类,并且要通过其指定父类,来完成继承,例如:
我们一个类名为a
:
class a: pass
我想写一个新类b
,来继承a
,我们可以这样写:
class b(a): pass
这样的话,b
类就继承了a
类所有的属性和方法。
我们来试试,我们定义一个汽车类car
,并且写一个子类,继承car
。
上述代码,我们先定义了一个car
类,其中需要给该类传入一个name
,且该类有2个方法,分别为startCar
、stopCar
。我们分别在2个方法中打印一下信息。
接着,我们再定义了一个类smallCar
,该类继承car
,且在该子类中,也定义了一个方法,setColor
,该方法中也输出了一个语句。
最后在main
函数中,我们实例化一个smallCar
,命名为c
,我们调用继承过来的startCar
、stopCar
以及自身的setColor
方法。
实际执行效果如下:
我们发现,smallCar
继承了父类所有的方法和属性。我们在samllCar
中并没有定义构造函数来获取name
传参,但是我们继承了car
类,也继承了其构造函数。
这里也要注意一点,并不是所有的属性和方法都可以继承过来的,就比如我们上一篇讲的类的私有属性,我们修改下代码:
我们在父类中,我们定义了类私有属性__name
,此时若我们执行startCar
和stopCar
是没问题的,因为这2个方法是属于car
类的,但是smallCar
却不能执行该方法,因为它没办法获取,我们若执行,则会报错,如下:
可见,类私有属性,并不能被继承过来。
多重继承
多重继承比较简单哈,这里就距离说明一下即可,在python
中除了单继承,python
类还支持继承多个父类,下面举个例子:
上述代码,我们先定义了网络设备类networkDevice
,它有一个networking
方法,而后定义了computer
类,它有一个device
方法。最后再定义nodebook
类,该类继承networkDevice
和computer
类,所以nodebook
类有networking
方法和device
方法,我们运行试下:
那假如,我们定义的2个父类,都有相同的方法呢? 比如:
我们在networkDevice
类中,也定义了device
方法,那么子类,应该继承哪个父类呢? 在python
中,并不是通过调用的父类的先后顺序决定的,而是通过一种MRO的算法类确定的,这里就暂时不讲MRO了,反正该代码不会报错。
多态
用一句话来概述多态就是 通过不同的对象,调用同一个方法,会有不同的响应,这就是多态。
在python
中,我们使用继承 + 方法重写来完成多态,比如我们写一个案例:
上述代码,我们先定义了一个基类ObjectStorageServers
,该类构造方法需要接收一个key
,且还定义了2个方法,login
和update
。随后我们分别定义了OSS
和COS
类,此2类都继承ObjectStorageServers
类,并且重写了login
和update
方法。最后分别来定义oss
对象 和 cos
对象,来调用login
方法和update
方法。
代码执行后结果为:
可以看到,oss
对象和cos
对象都调用了login
方法和update
方法,但是此2者都表现出不一样的行为,这就是多态。
总结
本篇文章,我们仅介绍了2个点,一个是继承,一个是多态。继承是面向对象的特性之一,目的是实现代码复用,继承的类,我们称之为子类,被继承的类,我们称之为父类,子类会继承父类所有的属性和方法,但是有个特殊的,就是不会继承父类的私有属性。