浅谈python中的多态


Posted in Python onJune 15, 2021

一、多态

多态是指一类事物有多种形态,比如动物类,可以有猫,狗,猪等等。(一个抽象类有多个子类,因而多态的概念依赖于继承)

import abc
class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
    @abc.abstractmethod
    def talk(self):
        pass

class Cat(Animal): #动物的形态之一:猫
    def talk(self):
        print('say miaomiao')

class Dog(Animal): #动物的形态之二:狗
    def talk(self):
        print('say wangwang')

class Pig(Animal): #动物的形态之三:猪
    def talk(self):
        print('say aoao')

二、多态性

注意:多态与多态性是两种概念

多态性是指具有不同功能的函数可以使用相同的函数名,这样就可以用一个函数名调用不同内容的函数。在面向对象方法中一般是这样表述多态性:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。

import abc
class Animal(metaclass=abc.ABCMeta): #同一类事物:动物
    @abc.abstractmethod
    def talk(self):
        pass

class Cat(Animal): #动物的形态之一:猫
    def talk(self):
        print('say miaomiao')

class Dog(Animal): #动物的形态之二:狗
    def talk(self):
        print('say wangwang')

class Pig(Animal): #动物的形态之三:猪
    def talk(self):
        print('say aoao')

c = Cat()
d = Dog()
p = Pig()

def func(obj):
    obj.talk()

func(c)
func(d)
func(p)

------------------------------

>>> say miaomiao
>>> say wangwang
>>> say aoao

综上可以说,多态性是 : 一个接口,多种实现

多态性的好处:

  • 增加了程序的灵活性,以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(obj)
  • 增加了程序额可扩展性,通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(obj)去调用

三、鸭子类型

调用不同的子类将会产生不同的行为,而无须明确知道这个子类实际上是什么,这是多态的重要应用场景。而在python中,因为鸭子类型(duck typing)使得其多态不是那么酷。

鸭子类型是动态类型的一种风格。在这种风格中,一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由"当前方法和属性的集合"决定。这个概念的名字来源于由James Whitcomb Riley提出的鸭子测试,“鸭子测试”可以这样表述:“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

在鸭子类型中,关注的不是对象的类型本身,而是它是如何使用的。例如,在不使用鸭子类型的语言中,我们可以编写一个函数,它接受一个类型为"鸭子"的对象,并调用它的"走"和"叫"方法。在使用鸭子类型的语言中,这样的一个函数可以接受一个任意类型的对象,并调用它的"走"和"叫"方法。如果这些需要被调用的方法不存在,那么将引发一个运行时错误。任何拥有这样的正确的"走"和"叫"方法的对象都可被函数接受的这种行为引出了以上表述,这种决定类型的方式因此得名。

鸭子类型通常得益于不测试方法和函数中参数的类型,而是依赖文档、清晰的代码和测试来确保正确使用。

Duck typing 这个概念来源于美国印第安纳州的诗人詹姆斯·惠特科姆·莱利(James Whitcomb Riley,1849- 1916)的诗句:”When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.”

先上代码,也是来源于网上很经典的案例:

class Duck():
    def walk(self):
         print('I walk like a duck')
    def swim(self):
         print('i swim like a duck')
 
class Person():
    def walk(self):
       print('this one walk like a duck') 
    def swim(self):
       print('this man swim like a duck')

可以很明显的看出,Person类拥有跟Duck类一样的方法,当有一个函数调用Duck类,并利用到了两个方法walk()和swim()。我们传入Person类也一样可以运行,函数并不会检查对象的类型是不是Duck,只要他拥有walk()和swim()方法,就可以正确的被调用。

再举例,如果一个对象实现了__getitem__方法,那python的解释器就会把它当做一个collection,就可以在这个对象上使用切片,获取子项等方法;如果一个对象实现了__iter__和next方法,python就会认为它是一个iterator,就可以在这个对象上通过循环来获取各个子项。

以上就是浅谈python中的多态的详细内容,更多关于python多态的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python Requests 基础入门
Apr 07 Python
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
Oct 12 Python
Bottle框架中的装饰器类和描述符应用详解
Oct 28 Python
python中字符串变二维数组的实例讲解
Apr 03 Python
python3 pandas 读取MySQL数据和插入的实例
Apr 20 Python
Python3多线程操作简单示例
May 22 Python
Django处理文件上传File Uploads的实例
May 28 Python
Python字典对象实现原理详解
Jul 01 Python
pytorch-神经网络拟合曲线实例
Jan 15 Python
使用IPython或Spyder将省略号表示的内容完整输出
Apr 20 Python
Python面向对象实现方法总结
Aug 12 Python
python 用Matplotlib作图中有多个Y轴
Nov 28 Python
如何正确理解python装饰器
Jun 15 #Python
详解python网络进程
整理Python中常用的conda命令操作
Python实现单例模式的5种方法
Jun 15 #Python
用Python爬取某乎手机APP数据
七个非常实用的Python工具包总结
python异常中else的实例用法
Jun 15 #Python
You might like
PHP实现的多彩标签效果代码分享
2014/08/21 PHP
WampServer下安装多个版本的PHP、mysql、apache图文教程
2015/01/07 PHP
PHP命名空间namespace用法实例分析
2016/09/27 PHP
yii通过小物件生成view的方法
2016/10/08 PHP
/etc/php-fpm.d/www.conf 配置注意事项
2017/02/04 PHP
php框架CodeIgniter主从数据库配置方法分析
2018/05/25 PHP
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
jQuery 中关于CSS操作部分使用说明
2007/06/10 Javascript
JQuery 写的个性导航菜单
2009/12/24 Javascript
超级24小时弹窗代码 24小时退出弹窗代码 100%弹窗代码(IE only)
2010/06/11 Javascript
jquery keypress,keyup,onpropertychange键盘事件
2010/06/25 Javascript
JS获取html对象的几种方式介绍
2013/12/05 Javascript
EasyUI中在表单提交之前进行验证
2016/07/19 Javascript
JS实现京东首页之页面顶部、Logo和搜索框功能
2017/01/12 Javascript
axios post提交formdata的实例
2018/03/16 Javascript
Vue手把手教你撸一个 beforeEnter 钩子函数
2018/04/24 Javascript
js删除对象/数组中null、undefined、空对象及空数组方法示例
2018/11/14 Javascript
vuex的使用和简易实现
2021/01/07 Vue.js
[54:53]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第二场
2014/05/23 DOTA
Python下的常用下载安装工具pip的安装方法
2015/11/13 Python
浅谈Python类里的__init__方法函数,Python类的构造函数
2016/12/10 Python
Python3实现发送QQ邮件功能(html)
2017/12/15 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
程序员的七夕用30行代码让Python化身表白神器
2019/08/07 Python
tensorflow:指定gpu 限制使用量百分比,设置最小使用量的实现
2020/02/06 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
2020/05/26 Python
python中查看.db文件中表格的名字及表格中的字段操作
2020/07/07 Python
Topshop美国官网:英国快速时尚品牌
2019/05/16 全球购物
Myprotein亚太地区:欧洲第一在线运动营养品牌
2020/12/20 全球购物
顶撞领导检讨书
2014/01/29 职场文书
篝火晚会策划方案
2014/05/16 职场文书
2014组织生活会方案
2014/05/19 职场文书
大四学生个人总结
2015/02/15 职场文书
2015年支教教师工作总结
2015/07/22 职场文书
如何在Python项目中引入日志
2021/05/31 Python
python实现对doc、txt、xls等文档的读写操作
2022/04/02 Python