鸭子类型

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

正文

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 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:动态语言与鸭子类型