专栏名称: Python中文社区
致力于成为国内最好的Python开发者学习交流平台,这里有关于Python的国内外最新消息,每日推送有趣有料的技术干货和社区动态。 官方网站:www.python-cn.com
目录
相关文章推荐
51好读  ›  专栏  ›  Python中文社区

Python协程演进过程

Python中文社区  · 公众号  · Python  · 2017-06-28 22:12

正文

Milestone

协程相关的关键字和方法的引入:

Python 2.2(2001年)yield

Python 2.5(2006年) .send() .throw() .close()

Python 3.3(2012年) yield from
Python 3.5(2015年)async await

Duck type

在面向对象的支持上,C++采用了多重继承等一系列C++风格的东西,Java是单继承+接口,JavaScript之前是Prototype,而Python采用了多继承+duck type,并用super来安全的初始化父类。而同样喜欢宣传自己优雅的设计的Ruby也是采用的Duck Type。

什么是Duck Type

当我看到一只鸟走路像鸭子,游泳像鸭子,叫声像鸭子,那我就把它叫做鸭子。(When I see a bird that walks like a duck and swims like a duck and quacks like a duck, I call that bird a duck.)

简而言之就是,判断一个对象的类型不是看他爸爸是谁,而是他实现了什么方法。
举个例子:

  1. >>> class Foo:

  2. ...     def __iter__(self):

  3. ...             pass

  4. ...

  5. >>> from collections import Iterable

  6. >>> isinstance(Foo(),Iterable)

  7. True

在命令行里运行如上代码,会发现Foo类并没有继承任何迭代相关的父类,但却被认为是可迭代对象。正是由于Duck Type,避免了复杂的继承关系。

Iterator

解释器在判断要给对象是否是可迭代对象时,是这么做的:

  1.    判断是否有__iter__,获取一个迭代器。

  2.    实现了__getitem__,创建一个迭代器,按索引获取元素。

  3.    不满足以上条件则对象不可迭代,抛出异常。

可迭代对象的UML图如下:

通过 iter 方法返回一个迭代器,而迭代器需要实现一个 next 方法和 iter 方法。







请到「今天看啥」查看全文