一起简单聊聊多态那点事

今天我们从python语言的角度简单介绍一下这个编程世界里的常客 :’ 多 态 '

1.什么是多态?

近些年有一种非常形象的表示多态性的例子: 鸭子叫

所以多态也被称为鸭子类型——其核心思想是,你写的代码不必在意一个对象是不是一只鸭子,只需要关心这个对象是否能向鸭子那样叫。黑鸦白鸭能叫的就是好鸭

具体这个鸭怎么去叫,如何实现这个功能就交给这个对象自己去完成就好了。

2.Python中的多态

介绍python中的多态前先介绍两个小例子:

比方说要写一个计算x和y相乘的程序:
C语言版本:》》》》

int x = 120;
int y = 120
printf("%d",x*y)#打印出x和y的乘积

很简单的一个小程序,那我们再来看看用python中编写这个程序:》》》

x, y = 120, 120
print(x*y)

这是第一种写法运行结果是
在这里插入图片描述

可是如果不给x 和 y 赋值为整型,会变成什么样?

x, y = 'hello world', 4
print(x*y)

再来看运行结果:
在这里插入图片描述
打印出来的是字符串类型,这是因为在python中,x*y的含义完全取决于x和y的对象类型,同样一个程序,当x,y都为整型那就执行乘法,如果其中有字符串就执行字符串的重复。

python中把对某一对象在某种语法下的合理性交给这个对象自身来判断。

实际上, * 是一个分派机制,将执行的控制权交给了被处理的对象

以上这种依赖类型的行为称为多态。(其含义就是一个操作的意义取决于被操作对象的类型,因为python是动态语言,所以多态随处可见,事实上python中所有操作都是多态操作。

FOR EXAMPLE:: print index *运算符 以及更多

3.python支持多态的原因

其实这一切是python发明者有意为之,并且很大程度上算是为什么python语言简洁和灵活的原因之一。

例如:函数可以自动地应用到所有类别的对象上,只要对象支持所预期的接口(也叫协议),函数就能处理它们,也就是说,如果传给函数的对象支持预期的方法和表达式运算符,它们对于函数逻辑来说就是 即 插 即 用 的 兼 容 性

比如我把上面的例子写成函数:》》》

def times(x, y):
	return x * y
#第一种调用
times(120, 120)
>>>14400

#第二种调用
times('hello world',4)
>>>'hello worldhello worldhello worldhello world'

#第三种调用(如果x 和 y都传入字符串会怎样?)
times('ni','ta')
>>>TypeError: can't multiply sequence by non-int of type 'str'

从上面我们会发现,第三种情况报错了,因为传入了两个都是字符串不可以相乘。

从这一点我们可以得知,当传入的对象不支持这种预期的接口时,那么python在运行时就会检测到错误,并且自动抛出一个异常,所以编写代码时的错误检测没有多大意义,反而会限制函数功能,因为这会将函数限制在通过我们所编写的测试的那些类型上。

4.总结

以上所说的,也就是python和静态类型语言(c 、java等)在语言设计哲学上的重大差异。

在python中你所写的代码不用关心特定的数据类型,不然代码就只对你所需要的类型有效,例如静态语言要类型声明,这从宏观角度看是破坏了代码的灵活性,所以我们在python中是对对象接口编程,而不是数据类型编程。

最后补充一句:
某些程序也有特殊要求,而多态的编程模型意味着我们必须测试代码来发现错误,而并非一开始就为编译器提供了用来检测错位的类型声明,但如果以做这些测试为代价换来代码灵活性的增加,我觉得是值得的,是 利 大 于 弊 的!

=====================================================================

如果觉得我的文章对你有帮助的,麻烦动动你的小手,关注支持一波!谢谢啦

########################################################################

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页