原文来自Python官网上的Python Tutorial文档中的词汇表(Glossary)。在此做个笔记。。水平有限,翻译难免不准。。。。


1、类字节对象(bytes-like object):支持buffer protocol的对象,诸如str,bytearray,memoryview。类字节对象可以用于很多操作,像是压缩,保存成一个二进制文件或是在socket上发送。有一些操作是需要二进制可变的,在这种情况下并不是所有的类字节对象都可以应用。


2、上下文管理器:通过定义__enter__(),__exit__(),在一个with声明中控制环境的对象


3、描述符:一个定义了__get__(),__set__(),__delete__()的新式类。当一个类属性是描述符时,它的绑定行为在属性被查找时触发。通常,使用a.b来获取,设置,删除属性时,是在类a中查找属性b。但是如果b是一个装饰器,相应的描述符方法被调用。


4、抽象基类:当诸如hasattr()等其他技术有错误时,提供一个方式来定义接口用来补充duck-typing。抽象基类引入虚拟的子类,这个虚拟的子类是没有从一个类继承,但是仍然能被isinstance()和issubclass()所认可的类。Python为数据结构,数字和流定义了很多内置的抽象基类。


5、duck-typing:无需定义变量类型,赋值给变量什么类型它就是什么类型


6、EAFP:Easy ask for forgiveness than permission。这种代码风格假设有效的属性或keys是存在的,并且在这种假设被证明是错的情况下,捕获异常。像try... expect这样的。


7、文件对象:使用面向文件的API(read(),write())来接触底层资源的对象。根据它创建方式的不同,一个文件对象可以接触到一个真实存在于磁盘上的文件或是另一种存储的形式或是直接和设备进行交流(例如标准输入输出,缓冲区,socket,pipe等)文件对象也被称为类文件对象和流。有三类文件对象:原始二进制文件,缓冲二进制文件和文本文件,它们的接口在io模块中定义


8、生成器:一个返回迭代器的函数。它看起来和通常的函数一样,除了返回的时候用的是yield声明。yield声明产生一系列的值,这些值用在for循环里面,因为循环可以通过next()方法来每次提取一个值。每一次yield被调用的时候都会暂停函数,记下位置,当下一次再被调用的时候,在暂停处继续。


9、全局解释器锁:CPython解释器用来保证每次只有一个线程执行Python字节码的机制。这简化了CPython的实施使对象模型(包括关键的内置类型)对并发访问变得安全。以多处理器机器提供的并行性为代价,锁定整个解释器使得解释器更容易变得多线程。但是一些扩展模块被设计成当进行计算密集的任务时(如压缩和哈希)释放GIL。当然当进行I/O操作时GIL也是被释放的。


10、LBYL:Look before you leap。这个类型明确地在执行前进行预测试,和EAFP相反。像if这样的就是LBYL的。但是在多线程中,这个方法会有风险。比如有一个代码:if key in mapping: return mapping[key]。如果另一个线程在这个线程测试之后,执行之前从mapping中移除了key就会产生异常。可以用锁或是用EAFP方法来解决。


11、元类:类的类。通过类名,类字典和基类的列表产生一个类。


12、命名元组:一个类元组的类。这个类的一些索引的元素也可以通过使用名称属性来获取。例如time.localtime()返回一个类元组的类,其中的year元素既可以通过t[0]来获取,也可以通过t.tm_year来获取。一个命名元组可以是内置的如time.struct_time类型,也可以是自定义的,可以通过工厂函数collections.namedtuple()产生


13、结构序列:一个带有命名元素的元组。和命名元组类似,既可以用索引获取,也可以用名称属性来获取,但它们没有_make(),_asdict()方法