python演变_Python协程演进过程

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.)

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

举个例子:

>>> class Foo:... def __iter__(self):... pass...>>> from collections import Iterable>>> isinstance(Foo(),Iterable)True

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

Iterator

87cd02ba04d09e60512cd18713115d3f.png

源码 群 595266089

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

判断是否有__iter__,获取一个迭代器。 实现了__getitem__,创建一个迭代器,按索引获取元素。 不满足以上条件则对象不可迭代,抛出异常。

可迭代对象的UML图如下:

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

Generators

生成器是为了满足惰性加载而出现的,比如一些数据在使用时才生产出来,而不是初始化时就加载到内存里了。在编程中,英文含有lazy的相关专业词汇大多都是这样的作用。

在python中,一个函数中如果有yield关键词,那么这个函数就是个生成器函数,该函数调用时会立即返回一个生成器对象,而不是函数结果。而要获取该函数产出的结果,需要调用next方法(根据不同版本,有的是双下划线版本的next方法)。

协程的定义是,一个可以随时挂起并让出CPU控制权的控制流。惰性加载在协程中的意义在于,可以通过将未来的控制流放在next方法中,使得程序暂时让出CPU,在需要时通过send方法转进回来。

Summary

Python的Duck Type保证了一种灵活的面向对象实践。

在迭代器基础上实现了惰性加载的生成器,之后为了完善生成器,提供了send等方法,和原有的next方法配合,是实现协程的基础。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值