在 Python 中,数据属性和处理数据的方法统称为属性(attribute)。其实方法只是可调用的属性。除了这二者外,还可以创建特性(property),在不改变类接口的前提下,使用存取方法(即读值和设值方法)修改数据属性。这与统一访问原则相符:不管服务是由存储和计算实现的,一个模块提供的所有服务都应该通过统一的方式使用。
流畅的 Python(11):协程
yield 对于 Python 来说,有两个含义:
- yield item 会产生一个值,提供给 next(…) 的调用方
- 此外还会做出让步,暂停执行生成器,让调用方继续工作,直到需要使用另一个值时再调用 next()。调用方会从生成器中拉取值
从语法上来看,协程与生成器都是类似的,都是定义体中包含 yield 关键字的函数。但是在协程中,yield 通常出现在表达式的右边,可以产出值,也可以不产生。如果 yield 关键字后面没有表达式,那么生成器产出 None。协程可能会从调用方接收数据,调用方把数据提供给协程使用的是 .send(datum) 方法,而不是 next(…) 函数。通常调用方会把值推送给协程。
流畅的 Python(10):上下文管理器和 else 块
这里讨论 Python 用户往往会忽视或者没有充分使用的几个特性,包括:
- with 语句和上下文管理器
- for、while 和 try 语句的 else 子句
with 语句会设置一个临时的上下文,交给上下文管理器对象控制,并负责清理上下文。这样做能够避免错误并减少样板代码,因此 API 更安全且易于使用。
流畅的 Python(9):可迭代的对象、迭代器和生成器
程序中的形式应该仅仅反映它所要解决的问题,代码中的其他任何外加形式都是一个信号,表明对问题的抽象还不够深。迭代是数据处理的基石。扫描内存中存不下的数据集时,需要找到一种惰性获取数据项的方式,即按需一次获取一个数据项。这就是迭代器模式。
流畅的 Python(8):正确重载运算符
运算符重载的作用是让用户定义的对象使用中缀运算符或一元运算符。在 Python 中,其实函数调用、属性访问和元素访问其实都是运算符,但是这里只讨论一元运算符和中缀运算符。
流畅的 Python(7):接口与继承
这篇文章将讨论接口:从鸭子类型的代表特征-动态协议,到使用接口更明确、能验证实现是否符合规定的抽象基类(Abstract Base Class,ABC)。抽象基类与描述符和元类一样,是用于构建框架的工具,一般都不需要自己编写抽象基类,因为很容易过度设计。
流畅的 Python(6):序列的修改、散列和切片
这篇文章将自定义一个序列类型 Vector,进一步探讨 Python 序列的修改、散列和切片等操作所涉及的背后原理。
流畅的 Python(5):符合 Python 风格的对象
这篇文章主要介绍 Python 的面对对象惯用法,首先介绍对象与对象名称的区别,解释对象标识、值和别名等概念,以及垃圾回收、del 命令、如何通过弱引用记住对象,而无需对象本身存在。最后会介绍符合 Python 风格的对象。
流畅的 Python(4):函数装饰器和闭包
函数装饰器用于在源码中标记函数,以某种方式增强函数的行为。这是一项强大的功能,若想彻底掌握它,首先必须理解闭包。除了在装饰器中有用处之外,闭包还是回调式异步编程和函数式编程风格的基础。
流畅的 Python(3):一等函数 & 使用一等函数实现设计模式
从设计上看,不管函数式语言的定义如何,Python 都不是一门函数式语言。Python 只是从函数式语言中借鉴了一些好的想法。这篇文章主要讲解 Python 中的函数,以及利用 Python 中的函数是一等对象这个特性,重新实现一些设计模式。