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. java 抽象类和接口整理

    java中定义一些不含方法体的方法,方法体的实现交给该类的子类根据自己的具体情况去实现,这样的方法就是abstract修饰的抽象方法,包含抽象方法的类叫抽象类,用abstract修饰 抽象方法: ab ...

  2. Python的特有的参数传递(*和**)

    目录 值传递 引用传递 python的传递方式具有两种值传递和引用传递.除此之外,python中还允许包裹方式的参数传递,这未不确定参数个数和参数类型的函数调用提供了基础: 值传递 int.float ...

  3. IDEA 更改提示一键补全快捷键

    偏好设置-->KeyMap-->用关键字搜索可以用下面图中的任意词只要能定位到就是可以的 (Choose Lookup Item Replace)然后增加想用的键,个人喜欢直接加一个空格

  4. 如何切换本地的GIT账号

    如何切换本地的GIT账号 1.为什么登陆第一次Git之后,就不用登陆了呢? 因为电脑已经将你的登陆凭据给保存起来了. 这也正是你不知道如何切换账号的原因. 2.在哪里能看已经保存的登陆凭证呢?并能够切 ...

  5. Java语法进阶12-集合

    集合 集合:是一种容器,用来装对象的容器,不能装基本数据类型. 数组也是容器,可以用来装基本数据类型,也可以用来装对象. 本质上,集合需要用对应的数据结构实现,是多个类实现接口Collection系列 ...

  6. 【原创】003 | 搭上基于SpringBoot事务思想实战专车

    前言 如果这是你第二次看到师长,说明你在觊觎我的美色! 点赞+关注再看,养成习惯 没别的意思,就是需要你的窥屏^_^ 专车介绍 该趟专车是开往基于Spring Boot事务思想实战的专车,在上一篇 搭 ...

  7. ecosystem.config

    ecosystem.config.js module.exports = { apps : [{ name : 'TOB_NODE', script : 'app.js', // 开发环境变量 env ...

  8. Ceph 提供iSCSI存储

    Tgtd+Ceph部署 一.yum安装tgt [root@c720181 ~]# yum --enablerepo=epel -y install scsi-target-utils libxslt ...

  9. R语言计算IV值

    更多大数据分析.建模等内容请关注公众号<bigdatamodeling> 在对变量分箱后,需要计算变量的重要性,IV是评估变量区分度或重要性的统计量之一,R语言计算IV值的代码如下: Ca ...

  10. 笔记||Python3之文件的读写

    [文件的读模式]            文件的对象:文件的读写通过文件操作对象进行. Python2  -----  File Python3  -----  TextIOWrapper       ...