浅谈Python之多态与接口,Pyhton有没有多态?

Python有没有多态???这个问题老是被问起来,答案是有的。python这么强大,有什么理由没有多态?

那么我们来看看什么叫多态?
这是C#语言子类对父类的重写
这是C#语言子类对父类的重写,其实不难读懂,一个Car的类继承了Vehicle的父类,而在子类中对Run()方法进行了重写。什么是重写?即子类属性或方法对父类中相同名字的属性或方法进行覆盖这就是重写。
在这里插入图片描述
我们来实例化一个Car,但是你会发现这个Car却是属于Vehicle类的!只学了Python的小伙伴可能会奇怪这是个什么东西??但是我想说这个在C#等语言是可以实现的。这怎么理解?不急,我们来看看。

如果按照前面的代码这个v.Run()得到的结果会是什么呢?答案是Car is running!
因为这个Run()的方法已经被重写了。
在这里插入图片描述
但是这时如果我们把virtual 和 override(这两个修饰词意思是被重写和重写(这里理解为被重写有些片面,因为virtual这个单词意思是虚的,那么我们就应该理解为名存实亡的,因为他已经被重写了,实际上他存不存在都无所谓了)) 去掉,这样得到的就是一个I’m running!,因为这两个方法并不存在重写和被重写的关系,既然v属于Vehicle这个类,那么自然而然的v.Run()得到的就是I’m running!。

这就需要引入一个新的概念了,父类与子类的代差,他们之间对相同方法会有不同的效果,而这就是多态。
所谓多态,基于重写机制,而函数成员的具体行为由对象(实例化)来决定的。

那么回到Python,Python的继承和重写好像不具有那种代差呀???那哪能叫Python有多态???

class Vehicle:
	def Run(self):
		print('I am running!')

class Car(Vehicle):
	def Run(self):
		print('Car is running!')
	
c = Car()
v = Vehicle()
c.Run()	
v.Run()

在这里插入图片描述
当Car继承了Vehicle之后,除非你实例化一个Vehicle的类对象,否则你永远也用不到在它其中的Run()函数了,因为在子类中他已经被覆盖了,也就是在子类中的Run()用都是Car is running!了,哪怕是子类的子类。

既然是这样那Python中根本没有像C#一样的代差,还谈何多态呢?
虽然Python中的多态的确没有代差,但是多态是的的确确存在的。来看一看这个:

class Animal:
    def Run(self):
        pass

class People(animal):
    def Run(self):
        print('I am walking')

class Dog(animal):
    def Run(self):
        print('I am running')

何为多态?多态就是一种事物的多重形态。人是动物,狗也是动物,那么对于Animal来说People和dog就是他的一种多态。
只是这些父类和子类不存在代差而已,那为什么python的多态不存在代差呢?这样不是跟不好了吗?一个Car不能同时Car is running和I’m running了。

但是重点来了!
Python是遵循鸭子类型的,什么是鸭子类型?
“只有一只鸟看起来像,走起来像,游起来像,甚至叫起来也想鸭子,那么我们就把他当做鸭子。”
正是这种编程模式,python可以把两个毫无关系的类进行继承关系,就像人也会跑,狗也会跑,那么人就可以继承于狗。(这不是教你去嘲讽别人。。。)
正是这样,用python在编写程序程序的时候更加符合“高内聚,低耦合”的编程原则。

接下来,我们来看看接口是什么吧。
Python之接口

猜你喜欢

转载自blog.csdn.net/The_RedMaple/article/details/106172890