关于Python的property,yield,slot

yield

要理解yield,先看两段代码。

yield和return很像。不过yield返回的是一个生成器。生成器和迭代器很像,不过生成器只能遍历一次,因为每次next()被调用时,生成器会返回它脱离的位置,就是说它只能记住语句最后一次执行的位置和所有的数据值)。

property

在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改:

这显然不合逻辑。为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,通过这两个方法就能限制score了。

这样,我们就能对score进行参数检查了。

但是看着代码,好烦,一点也不Pythonic。

Python里面有个built-in方法property可以胜任这个工作。Python内置的@property装饰器就是负责把一个方法变成属性调用的:

如果不定义@score.setter,property默认只是给score增加了一个getter属性,它是作为一个只读属性存在。

requests里面有段源码,可以参考下。

slots

看段代码。

使用slots有以下好处。

  • slots会限定只能设定这两个属性
  • 继承的子类不受限制
  • 能省点内存。

with

with这个关键词,挺常用的。今天偶然翻到一篇PEP,才发现原来一个with干了这么多事。

大概是这么个逻辑,PEP-343里描述得更详细,推荐读一下。

super

发表评论

电子邮件地址不会被公开。 必填项已用*标注