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 关键字和保留字 Java 关键字列表 (依字母排序 共51组): abstract, assert,boolean, break, byte, case, catch, char, clas ...

  2. 源码安装php7.2

    `# 安装依赖包 yum install -y gcc gcc-c++ make zlib zlib-devel pcre pcre-devel \ libjpeg libjpeg-devel lib ...

  3. Laravel 中使用 swoole 项目实战开发案例一 (建立 swoole 和前端通信)

    1 开发需要环境 工欲善其事,必先利其器.在正式开发之前我们检查好需要安装的拓展,不要开发中发现这些问题,打断思路影响我们的开发效率. 安装 swoole 拓展包 安装 redis 拓展包 安装 la ...

  4. 使用PaintCode便捷地实现动画效果

    // // ViewController.m // paintCodeTestOC //gif // Created by LongMa on 2019/7/25. // #import " ...

  5. 【nodejs原理&源码赏析(5)】net模块与通讯的实现

    [摘要] Node.js net模块的原理及使用 示例代码托管在:http://www.github.com/dashnowords/blogs 一. net模块简介 net模块是nodejs通讯功能 ...

  6. 消息通知机制(NSNotification和NSNotificationCenter)

    作者:FlyElephant 出处:http://www.cnblogs.com/xiaofeixiang iOS中委托模式和消息机制基本上开发中用到的比较多,一般最开始页面传值通过委托实现的比较多, ...

  7. lodash.memoize

    目录 _.memoize(func, [resolver]) 举例1: 获取J(1000000)的值 举例2: 斐波那契数列F(1000)的值 _.memoize(func, [resolver]) ...

  8. CodeForces 607B zuma

    Genos recently installed the game Zuma on his phone. In Zuma there exists a line of n gemstones, the ...

  9. 2018HDU多校训练一 C -Triangle Partition

    Chiaki has 3n3n points p1,p2,-,p3np1,p2,-,p3n. It is guaranteed that no three points are collinear.  ...

  10. 基于RT-Thread的人体健康监测系统

    随着生活质量的提高和生活节奏的加快,人们愈加需要关注自己的健康状况,本项目意在设计一种基于云平台+APP+设备端的身体参数测试系统,利用脉搏传感器.红外传感器.微弱信号检测电路等实现人体参数的采集,数 ...