likes
comments
collection
share

python|面向对象-2|探讨继承和多态

作者站长头像
站长
· 阅读数 12

上一篇文章,我们介绍了什么是面向对象、以及面向对象和面向过程的区别,最后我们写了案例来简单的介绍一下类class,包括 如何创建一个类,类的构造函数__init__()和析构函数__del__()的意义,以及将类变量设置为私有变量。如果你还没有看过该文章,建议你先看下,以便做到承上启下。

本篇文章,将通过实例的方式,简单介绍一下继承和多态。

继承

在面向对象中,继承是最常见的代码复用技术,它允许我们从一个类派生出一个新的类,并且新的类继承父类的属性和方法,我们将其称之为继承。

python中,我们还是使用class来定义一个类,并且要通过其指定父类,来完成继承,例如:

我们一个类名为a:

class a:
	pass

我想写一个新类b,来继承a,我们可以这样写:

class b(a):
    pass

这样的话,b类就继承了a类所有的属性和方法。

我们来试试,我们定义一个汽车类car,并且写一个子类,继承car

python|面向对象-2|探讨继承和多态

上述代码,我们先定义了一个car类,其中需要给该类传入一个name,且该类有2个方法,分别为startCarstopCar。我们分别在2个方法中打印一下信息。

接着,我们再定义了一个类smallCar,该类继承car,且在该子类中,也定义了一个方法,setColor,该方法中也输出了一个语句。

最后在main函数中,我们实例化一个smallCar,命名为c,我们调用继承过来的startCarstopCar以及自身的setColor方法。

实际执行效果如下:

python|面向对象-2|探讨继承和多态

我们发现,smallCar继承了父类所有的方法和属性。我们在samllCar中并没有定义构造函数来获取name传参,但是我们继承了car类,也继承了其构造函数。

这里也要注意一点,并不是所有的属性和方法都可以继承过来的,就比如我们上一篇讲的类的私有属性,我们修改下代码:

python|面向对象-2|探讨继承和多态

我们在父类中,我们定义了类私有属性__name,此时若我们执行startCarstopCar是没问题的,因为这2个方法是属于car类的,但是smallCar却不能执行该方法,因为它没办法获取,我们若执行,则会报错,如下:

python|面向对象-2|探讨继承和多态

可见,类私有属性,并不能被继承过来。

多重继承

多重继承比较简单哈,这里就距离说明一下即可,在python中除了单继承,python类还支持继承多个父类,下面举个例子:

python|面向对象-2|探讨继承和多态

上述代码,我们先定义了网络设备类networkDevice,它有一个networking方法,而后定义了computer类,它有一个device方法。最后再定义nodebook类,该类继承networkDevicecomputer类,所以nodebook类有networking方法和device方法,我们运行试下:

python|面向对象-2|探讨继承和多态

那假如,我们定义的2个父类,都有相同的方法呢? 比如:

python|面向对象-2|探讨继承和多态

我们在networkDevice类中,也定义了device方法,那么子类,应该继承哪个父类呢? 在python中,并不是通过调用的父类的先后顺序决定的,而是通过一种MRO的算法类确定的,这里就暂时不讲MRO了,反正该代码不会报错。

多态

用一句话来概述多态就是 通过不同的对象,调用同一个方法,会有不同的响应,这就是多态。

python中,我们使用继承 + 方法重写来完成多态,比如我们写一个案例:

python|面向对象-2|探讨继承和多态

上述代码,我们先定义了一个基类ObjectStorageServers,该类构造方法需要接收一个key,且还定义了2个方法,loginupdate。随后我们分别定义了OSSCOS类,此2类都继承ObjectStorageServers类,并且重写了loginupdate方法。最后分别来定义oss对象 和 cos对象,来调用login方法和update方法。

代码执行后结果为:

python|面向对象-2|探讨继承和多态

可以看到,oss对象和cos对象都调用了login方法和update方法,但是此2者都表现出不一样的行为,这就是多态。

总结

本篇文章,我们仅介绍了2个点,一个是继承,一个是多态。继承是面向对象的特性之一,目的是实现代码复用,继承的类,我们称之为子类,被继承的类,我们称之为父类,子类会继承父类所有的属性和方法,但是有个特殊的,就是不会继承父类的私有属性。