python语言的鸭子类型和强类型语言的多态

  前面讲接口类的时候举过一个有关支付方式的例子,支付方式可以有几种,微信支付,支付宝支付,苹果支付等,这几个不同的支付都统一于支付,像这样几个类都统一于

某一个类或者某一个方法,或者说一个类有不同的形态的情况就属于多态;虽然几种支付方式都归一于支付类,执行的方法一样,但是每一个支付方式都有自己的特性,实现的

形态也不一样,即为多态性。

class Payment:  # 必要的父类
def pay(self,money):
pass
class Wechatpay(Payment): # 子类继承父类
def pay(self,money):
print('已经使用微信支付了%s元' % money) class Alipay(Payment): # 子类继承父类
def pay(self,money):
print('已经使用支付宝支付了%s元' % money) class Aapplepay(Payment): # 子类继承父类
def pay(self,money):
print('已经使用苹果支付了%s元' % money) def pay(pay_obj,money): # 受到父类的约束,这里的pay_obj只能传入继承了父类的子类
# 统一支付入口,归一化设计,不管使用哪种方式,都统一于支付方法
pay_obj.pay(money)

也可以不用在前面加上一个父类对子类进行约束也可以达到多态的效果

 
class Wechatpay():
def pay(self,money):
print('已经使用微信支付了%s元' % money) class Alipay():
def pay(self,money):
print('已经使用支付宝支付了%s元' % money) class Aapplepay():
def pay(self,money):
print('已经使用苹果支付了%s元' % money) def pay(pay_obj,money): # 这里的pay_obj对数据不敏感,只要是含有pay方法的都可以传入
# 统一支付入口,归一化设计,不管使用哪种方式,都统一于支付方法
pay_obj.pay(money) pay(Aapplepay(),10000) # 这里可以随意的传入支付方式,只要传入的方式里面有归一的pay方法

  因为在python里面传参的时候:def pay(pay_obj,money),对数据不敏感,所以可以完全不用借助父类来表现出多态,像python这样不必需要一个父类来约束子类就可以形成多态的类型叫做鸭子类型。所以说python天生支持多态,属于动态强类型语言。

但是其他语言比如Java必须借助class Payment父类来传父类的数据类型才可以,用父类来约束子类,如果传的不是父类的数据类型则会报错,这样的类型情况才是属于正真的多态,也就是强类型语言中的多态。

  python(鸭子类型):不崇尚根据继承所得来的相似,我只是自己实现自己的代码就可以了。如果两个类刚好相似,并不产生父类的子类的兄弟关系就是鸭子类型。比如list 和tuple就是这样的关系,它们本身有好多相似的方法,但是并没有通过父类去约束而找出相似的地方,只是我们自己写代码的时候自我约束。

  鸭子类型的优缺点:

  优点:松耦合,每个相似的类之间都没有影响,删除或修改一个类的代码不会影响其他类的

  缺点:太随意,只能自己写代码自觉约束

再用一个比较好理解的例子来说明python语言的鸭子类型和强类型语言的多态:list 和 tuple

鸭子类型:

class List():
def __len__(self):pass
class Tuple():
def __len__(self):pass
def len(obj):
return obj._len_()
l = Tuple()
len(l) # 这里的l可以是列表也可以是元祖,不管是那个都可以将参数传入len中,只要含有len方法都可以传入

强类型语言的多态:

class Foo:pass  # 必须有一个父类
class List(Foo): # 子类要继承父类
def __len__(self):pass
class Tuple(Foo): # 子类要继承父类
def __len__(self):pass
def len(obj):
return obj._len_()
l = Tuple()
len(l) # 这里的l只能是继承了Foo的类,数据类型必须和Foo的一样,如果上面的obj传入的是list这里的l也必须是list,否则会报错

总结:接口类和抽象类在python当中的应用点并不是非常必要

python语言的鸭子类型和强类型语言的多态的更多相关文章

  1. Python中的鸭子类型

    今天,我们来聊一聊Python中的鸭子类型(duck typing). 编程语言具有类型概念,例如Python中有数字类型.字符串类型.布尔类型,或者更加复杂的结构,例如元组tuple.列表list. ...

  2. Python 中的鸭子类型和猴子补丁

    原文链接: Python 中的鸭子类型和猴子补丁 大家好,我是老王. Python 开发者可能都听说过鸭子类型和猴子补丁这两个词,即使没听过,也大概率写过相关的代码,只不过并不了解其背后的技术要点是这 ...

  3. [py]python多态-动态语言的鸭子类型

    弱类型?强类型?动态语言,静态语言 弱类型: 在程序运行过程中,类型可变 还有一种说法: 动态 variables must necessarily be defined before they ar ...

  4. 010_动态语言与鸭子类型及python2和3的区别

    一. 动态语言中经常提到鸭子类型,所谓鸭子类型就是:如果走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子(If it walks like a duck and quacks like a duck, ...

  5. Python面向对象之鸭子类型

    python没有多态?他有什么? 他有鸭子类型. 鸭子类型 : 看着像鸭子,他就是鸭子. 比如一些类,他们中有一些方法,有着相同的功能, 这时为我们将这些相同功能的名字命名为一样的. 那么这些类 都互 ...

  6. Python - 协议和鸭子类型

    参考: Fluent_Python - P430 wiki 这里说的协议是什么?是让Python这种动态类型语言实现多态的方式. 在面向对象编程中,协议是非正式的接口,是一组方法,但只是一种文档,语言 ...

  7. Python装饰器AOP 不定长参数 鸭子类型 重载(三)

    1 可变长参数与关键字参数 *args代表任意长度可变参数 **kwargs代表关键字参数 用*args和**kwargs只是为了方便并没有强制使用它们. 缺省参数即是调用该函数时,缺省参数的值若未被 ...

  8. python与鸭子类型

    部分参考来源:作者:JasonDing  https://www.jianshu.com/p/650485b78d11##s1 首先介绍下面向对象(OOP)的三大特征: (1)面向对象程序设计有三大特 ...

  9. 第7.3节 Python特色的面向对象设计:协议、多态及鸭子类型

    Python是一种多态语言,其表现特征是:对象方法的调用方只管方法是否可调用,不管对象是什么类型,从而屏蔽不同类型对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化. 一.    P ...

随机推荐

  1. Ansible Playbooks 介绍 和 使用 二

    目录 handlers playbook 案例 2 handlers vars 变量 setup facts 变量使用 案例 inventory 中定义变量 案例 条件测试 when 语句 案例 迭代 ...

  2. shell脚本介绍、shell脚本结构和执行、date命令用法、shell脚本中的变量

    7月11日任务 20.1 shell脚本介绍20.2 shell脚本结构和执行20.3 date命令用法20.4 shell脚本中的变量 20.1 shell脚本介绍 1.shell脚本语言是linu ...

  3. 8. SOFAJRaft源码分析— 如何实现日志复制的pipeline机制?

    前言 前几天和腾讯的大佬一起吃饭聊天,说起我对SOFAJRaft的理解,我自然以为我是很懂了的,但是大佬问起了我那SOFAJRaft集群之间的日志是怎么复制的? 我当时哑口无言,说不出是怎么实现的,所 ...

  4. oracle创建jobs定时任务报错:PLS-00306: wrong number or types of arguments in call to 'JOB'

    原脚本: begin  sys.dbms_job.submit(job => job,                      what => 'xxx;',              ...

  5. [NACOS HTTP-GET] The maximum number of tolerable server reconnection errors has been reached

    错误的意思是:已达到可容忍的服务器重连接错误的最大数目.有两个解决思路:一个将这个值设置的更大:然后是排查自己连接服务哪儿出了问题.先说在哪儿设置这个值:在拉取nacos服务的注解配置中,添加一个属性 ...

  6. iOS设计模式之:建造者模式Builder Pattern,用于改进初始化参数

    转自:http://www.cnblogs.com/wengzilin/p/4365855.html 本文主要讨论一下iOS中的Builder Pattern.与网上很多版本不同,本文不去长篇大论地解 ...

  7. bug小结

    在不同的文件下面可以创建同一个包,但是不能创建同一个class文件!!!   ParameterType:需要写实体类的类型,最好不要写实体的别名 这是因为我们在配置mybatis的配置文件时已经说明 ...

  8. C++与数据结构课程设计---定票咨询系统

    订票咨询管理系统 设计编制一个订票管理系统,考虑旅客不同的要求.例如,选择不同的交通工具,希望在旅途中的时间尽可能地短,期望旅费尽可能省,或要求中转次数最少等.为旅客提供两种或三种最优决策.车票基本信 ...

  9. 转-友晶Sdram_Control_4Port的全页操作Bug?

    http://www.cnblogs.com/edaplayer/p/3678897.html 以前在学校初学fpga的时候碰到sdram就搞不定了,现在突然发现网上有好多现成的代码,友晶的,alte ...

  10. 【H5】316- 移动端H5跳坑指南

    最近在一个移动端的 Web 项目中踩了很多的坑,感觉有必要把它们记录下来,分享给即将踏入移动端 Web 开发大门的朋友们,更好的解决ios和android兼容. 1.input获取焦点时,页面被放大 ...