前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >鸭子类型

鸭子类型

作者头像
Ryoma
发布2022-04-02 15:07:32
3880
发布2022-04-02 15:07:32
举报
文章被收录于专栏:小白维基小白维基

请注意:本文编写于 2019-08-23,其中某些信息可能已经失去时效性。

正文

学习 Python 的时候经常看到一个名词:鸭子类型,网上最常见的解释是:如果它走起路来像鸭子,叫起来也像鸭子,那么它就是鸭子(If it walks like a duck and quacks like a duck, it must be a duck)。但仅仅通过这一解释并没有办法让我很好的理解到底何为鸭子类型,于是我从网上找了一些案例来更好的理解:

Python 中任何实现了 __iter____next__ 方法的对象都可以成为迭代器。

代码语言:javascript
复制
# python3
# 例子来源:FOOFISH-PYTHON 之禅

class Foo:
    def __iter__(self):
        pass
    
    def __next__(self):
        pass

from collections import Iterable
from clooections import Iterator

print(isinstance(Foo(), Iterable)) # True
print(isinstance(Foo(), Iterator)) # True

通过实例解释后我自己的理解是:所谓鸭子类型就是一种荣誉或者说称呼,被称为「鸭子」的对象本身是很么类型不重要,重要的是它完成了「鸭子」所能完成的一切,所以它就配得上「鸭子」这个称呼。举个现实的例子:某男子在路边捡到一个遗孤,细心照顾把遗孤养大,虽然男子没有在血缘和法律上继承「父亲」的名号,但是他尽到了「父亲」该尽的职责,因此我们就可以称这个男子是遗孤的「父亲」,而男子并没有继承「父亲」的称呼,但是男子尽到了我们认为「父亲」该尽的职责。同理到例子中,Foo 类是没有继承「迭代器」,但是它完成了我们认为「迭代器」该完成的功能。

所以我认为(不要你以为,我要我以为,哈哈):在(任何语言的)编程中能够套用上面逻辑的对象都可以成为鸭子类型。

参考

  1. FOOFISH-PYTHON之禅-Python:动态语言与鸭子类型
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 正文
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档