Duck typing


本文为译文,点击 此处查看原文。

在计算机程序设计中,Duck typingDuck test的一个应用程序 —— “如果它像鸭子一样走路,像鸭子一样嘎嘎叫,那么它一定是鸭子” —— 用于确定一个对象是否可以用于特定目的。对于普通类型,适用性由对象的类型决定。在duck类型中,对象的适用性是由某些方法和属性的存在而决定的,而不是对象本身的类型。[1]

1. 示例

这是Python 3中的一个简单示例,演示了如何在任何上下文中使用任何对象,直到以不支持的方式使用为止。

class Duck:
    def fly(self):
        print("Duck flying")

class Airplane:
    def fly(self):
        print("Airplane flying")

class Whale:
    def swim(self):
        print("Whale swimming")

for animal in Duck(), Airplane(), Whale():
    animal.fly()

输出:

Duck flying
Airplane flying
AttributeError: 'Whale' object has no attribute 'fly'

2. 在静态类型语言中

某些通常是静态类型的语言,如Booc#的版本4,有额外的类型注释[2][3],指示编译器安排类的类型检查在运行时而不是编译时进行,并在编译后的输出中包含运行时类型检查代码。

3. 与其他类型系统的比较

3.1 结构化类型体系

Duck类型结构化类型(Structural type)相似,但不同于结构化类型。结构化类型是一个静态类型系统,它通过类型的结构来确定类型兼容性和等价性,而duck类型是动态的,仅通过在运行时访问的类型结构的一部分来确定类型兼容性。
OCaml、Scala、Go、Elm[4]、Gosu 和 PureScript 语言在不同程度上支持结构类型。

3.2 协议与接口

协议和接口可以提供duck类型的一些好处,但是duck类型的不同之处在于没有定义显式接口。例如,如果第三方库实现了一个不能修改的类,客户端就不能使用该类的实例,即使该类实际上满足接口需求,但该实例的接口对该库来说是未知的。(这个问题的一个常见解决方案是适配器模式。) Duck类型可以做到这一点。同样,为了兼容性,必须满足所有接口。

3.3 模板或泛型类型

模板、泛型函数或方法在一个静态类型上下文中应用duck test;这通常带来了静态和动态类型检查的所有优点和缺点。Duck类型还可以更加灵活,因为只需要实现在运行时实际调用的方法,而模板需要实现所有在编译时无法证明不可用的方法。
示例包括使用模板的C++和D语言,它们是由Ada泛型开发的。

4. 批评

4.1 对术语本身的批评

术语“duck typing”的使用被认为是多余的,因为动态绑定等其他术语更清楚地表达了这个概念[5]。静态类型检查的支持者, duck typing暗示typing的缺失,使其与术语typing的结合显得不连贯。

5. 其他资料

6. 参考文献

  1. “Glossary — Python 3.7.1 documentation”. docs.python.org. Retrieved 2018-11-08.
  2. Boo: Duck Typing Archived October 6, 2008, at the Wayback Machine
  3. “Anders Hejlsberg Introduces C# 4.0 at PDC 2008”. Retrieved 30 January 2017.
  4. Czaplicki, Evan. “Core Language · An Introduction to Elm”. Retrieved 30 January 2017.
  5. Lippert, Eric (2 Jan 2014). “What is “duck typing”?”. Fabulous adventures in coding. Retrieved 25 May 2016.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值