随笔分类 - 流畅的python
关于这本书的学习笔记,这本书非常棒
摘要:二十一、类元编程 (元类)是深奥的知识,99% 的用户都无需关注。如果你想知道是否需要使用元类,我告诉你,不需要(真正需要使用元类的人确信他们需要,无需解释原因)。 ——Tim Peters Timsort 算法的发明者,活跃的 Python 贡献者 类元编程是指在运行时创建或定制类的技艺。
阅读全文
摘要:二十、属性描述符 实现了 __get__、__set__ 或 __delete__ 方法的类是描述符。 描述符的用法是,创建一个实例,作为另一个类的类属性。 描述符类:实现描述符协议的类。 托管类:把描述符实例类属性的类。 描述符实例:描述符类的各个实例,声明为托管类的类属性。 In [22]: c
阅读全文
摘要:十九、动态属性和特性 在 python 中,数据的属性和处理数据的方法统称属性(attribute)。方法只是可调用的属性。 除了这二者之外,我们还可以创建特性(property),在不改变类接口的前提下,使用存取方法(即读值方法和设值方法)修改数据属性。 这与统一访问原则相符:不管服务是有存储还是
阅读全文
摘要:十八、使用 asyncio 包处理并发 asyncio包:使用事件循环驱动的协程实现并发。 线程与协程的对比 '\ thinking' 旋转等待效果 In [1]: import threading In [2]: import itertools In [3]: import time,sys I
阅读全文
摘要:十七、使用期物处理并发 期物指一种对象,表示异步执行的操作。 期物是 concurrent.futures 模块和 asyncio 包的重要组件,可是,作为这两个库的用户,我们有时却见不到期物,编写的代码没有直接使用。 期物封装待完成的操作,可以放入队列,完成的状态可以查询,得到结果(或抛出异常)后
阅读全文
摘要:十六、协程 生成器如何进化成协程 用作协程的生成器的基本行为 协程演示 In [51]: def s_c(): ...: print('c start') ...: x = yield ...: print('c received:',x) ...: In [52]: c = s_c() In [5
阅读全文
摘要:十五、上下文管理器和 else 块 with 语句会设置一个临时的上下文,交给上下文管理器对象控制,并且负责清理上下文。 能避免错误并减少样板代码,因此API更安全,而且更易于使用。 else 子句与 with 语句完全没有关系。 if 语句之外的 else 块 先做这个,再做那个 for/else
阅读全文
摘要:十四、可迭代的对象、迭代器和生成器 In [28]: import re 在 Iterable 类中定义。 In [29]: import reprlib In [30]: RE_WORD = re.compile('\w+') In [31]: class Sentence: ...: def _
阅读全文
摘要:十三、正确重载运算符 运算符重载的作用:让用户定义的对象使用中缀运算符或一元运算符。 Python 施加了一些限制,做好了灵活性、可用性和安全性方面的平衡: 1 不能重载内置类型的运算符 2 不能新建运算符,只能重载现有的 3 某些运算符不能重载—— is , and , or , not (位运算
阅读全文
摘要:十一、接口:从协议到抽象基类 抽象类表示接口。 ——Bjarne Stroustrup C++ 之父 从鸭子类型的代表特征动态协议,到使接口更明确、能验证实现是否符合规定的抽象基类(Abstract Base Class, ABC) 我们把协议定义为非正式的接口,是让 python 这种动态类型语言
阅读全文
摘要:十二、继承的优缺点 子类化内置类型很麻烦 内置类型(使用 C 语言编写)不会调用用户定义的类覆盖的特殊方法。 至于内置类型的子类覆盖的方法会不会隐式调用,CPython 没有制定官方规则。基本上,内置类型的方法不会调用子类覆盖的方法。例如,dict 的子类覆盖的 __getitem__() 方法不会
阅读全文
摘要:十、序列的修改、散列和切片 不要检查它是不是鸭子、它的叫声像不像鸭子、它的走路姿势像不像鸭子,等等。具体检查什么取决于你想使用语言的哪些行为。(comp.lang.python,2000 年 7月 26 日) ——Alex Martelli 多维向量 In [20]: from array impo
阅读全文
摘要:八、对象引用、可变性和垃圾回收 每个变量都有标识、类型和值。对象一旦创建,它的标识绝不会变;可以把标识理解为对象在内存中的地址。is运算符比较两个对象的标识;id() 函数返回对象标识的整数表示。 每个 Python 对象都有标识、类型和值。只有对象的值会不时变化。 作者:其实,对象的类型也可以变,
阅读全文
摘要:九、符合 python 风格的对象 绝对不要使用两个前导下划线,这是很烦人的自私行为。 ——Ian Bicking pip、virtualenv 和 Paste 等项目的创建者 得益于 python 数据模型,自定义类型的行为可以像内置类型那样自然。实现如此自然的行为,靠的不是继承,而是鸭子
阅读全文
摘要:七、函数装饰器和闭包 nonlocal @decorate def target(): print('running target()') 等同于 def target(): print('running target()') target = decorate(target) 综上,装饰器的一大特
阅读全文
摘要:六、使用一等函数实现设计模式 符合模式并不表示做得对。 ——Ralph Johnson 经典的《设计模式:可复用面向对象软件的基础》的作者之一 策略模式 订单 order 折扣策略,比如有三种 Promotion是策略基类,下面三个是具体实现的折扣策略 上下文 把一些计算委托给实现不同算法的可互
阅读全文
摘要:五、一等函数 一等对象:满足以下条件的程序实体 1 在运行时创建 2 能赋值给变量或数据结构中的元素 3 能作为参数传给函数 4 能作为函数的返回结果 In [9]: def f(n): # 这是一个控制台会话,因此我们是在“运行时”创建一个函数。 ...: """returns n!""" ...
阅读全文
摘要:四、文本和字节序列 Unicode 字符串、二进制序列 一个字符串是一个字符序列。从python3 的str对象中获取的元素是 Unicode字符,这相当于从Python2的 Unicode对象中获取的元素,而不是从Python2的str对象中获取的原始字节序列。 字符的标识,即码位,是0-1114
阅读全文
摘要:三、字典和集合 可散列类型:如果一个对象是可散列的,那么在这个对象的生命周期中,它的散列值是不变的。而且这个对象需要实现__hash__() 方法,还要有 __qe__() 方法,这样才能与其他键作比较。如果两个可散列对象是相等的,那么它们的散列值一定是一样的。 In [103]: a = (1,2
阅读全文
摘要:二、数据结构 容器序列和扁平序列;可变序列和不可变序列; 列表推导:通常的原则是,只用列表推导来创建新的列表,并且尽量保持简短。 Python 会忽略代码里 []、 和 () 中的换行,因此如果你的代码里有多行的列表、列表推导、生成器表达式、字典这一类的,可以省略不太好看的续行符 \。 python
阅读全文