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. Win10无法安装.NET Framework3.5的解决办法

    诸位网友如果工作中使用WIN10遇到如图的这种问题,现将解决办法整理如下: 一.第一步就是修复系统:按“Windows+X”点击“Windows PowerShell(管理员)&命令提示符(管 ...

  2. CentOS 7上利用systemctl添加自定义系统服务

    Centos 7 之 systemctl CentOS 7继承了RHEL 7的新的特性,例如强大的systemctl,而systemctl的使用也使得以往系统服务的/etc/init.d的启动脚本的方 ...

  3. 第四章 开始Unity Shader学习之旅(2)

    目录 1. 强大的援手:Unity提供的内置文件和变量 1.1 内置的包含文件 1.2 内置的变量 2. Unity提供的Cg/HLSL语义 2.1 什么是语义 2.2 Unity支持的语义 2.3 ...

  4. js5——页面转换

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. 了解 MongoDB 看这一篇就够了【华为云分享】

    目录 一.简介 二.基本模型 BSON 数据类型 分布式ID 三.操作语法 四.索引 索引特性 索引分类 索引评估.调优 五.集群 分片机制 副本集 六.事务与一致性 一致性 小结 一.简介 Mong ...

  6. Web安全测试实战之测试HTTP方法

    一. Http方法测试 有些Web服务器默认情况下开放了一些不必要的HTTP方法(如DELETE.PUT.TRACE.MOVE.COPY),这样就增加了受攻击面. 测试方法: 1.打开webscara ...

  7. 转:浅谈Spring的PropertyPlaceholderConfigurer

    大型项目中,我们往往会对我们的系统的配置信息进行统一管理,一般做法是将配置信息配置与一个cfg.properties的文件中,然后在我们系统初始化的时候,系统自动读取cfg.properties配置文 ...

  8. luogu P3152 正整数序列

    题目描述 kkk制造了一个序列,这个序列里的数全是由正整数构成的.你别认为她的数列很神奇--其实就是1, 2, -, n而已.当然,n是给定的.kkk的同学lzn认为0是一个好数字(看上去很饱满有木有 ...

  9. bug小结

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

  10. [TimLinux] myblog 数据表格显示

    1. 设计 2. 数据 创建数据库用户: CREATE USER IF NOT EXISTS 'user1'@'MyBlogPwd123'; GRANT ALL ON d1.* TO 'user1'@ ...