10天读完《编写高质量代码 改善Python编程的91个建议》——Day7
计划
Hello,这是一个读书摘要的计划,10天读完《编写高质量代码 改善Python编程的91个建议》,我会每天摘录大概9个书中提到的建议,分享在这里,也作为自己的打卡任务。关于这本书,他并不是python入门的教学书籍,而是一本用来改善编程习惯和风格的书,可以帮助我们写出漂亮的,也就是符合pythonic的python代码。书中的知识难度不会很大,每天看几条,然后落实到实际编程中加以巩固,就能融会贯通,久而久之也就能养成好的编程习惯。如果你没有时间看原书,那么直接看我的摘要就好啦,遇到感兴趣的再去详细了解也会方便很多,当然这里摘要的内容是我觉得有用的部分啦。注意,一定要会运用!
书摘
建议56 理解名字查找机制
使用locals()可以查看所有局部变量,使用globals()可以查看所有全局变量。
理解4种作用域:局部作用域、全局作用域、嵌套作用域和内置作用域。
建议57 为什么需要self参数
self本身就是实例对象本身,是对对象本身的引用。为什么需要self呢?
-
python设计之初参考率其他语言,如Moudla-3中的self。
-
python本身的动态性决定使用self能带来一些便利。
-
在存在同名的局部变量以及实例变量的情况下使用self使得实例变量更容易被区分。
建议58 理解MRO与多继承
多继承语法:class DerivedClassName(Base1, Base2, Base3)
MRO(Method Resolution Order,方法解析顺序) 搜索采用简单的自左至右的深度优先方法,既按照多继承申明的顺序形成继承树结构,自顶向下采用深度优先的搜索顺序,当找到所需要的属性或者方法的时候就停止搜索。
建议59 理解描述符机制
我们知道访问类属性的时候,使用__dict__和使用"."操作符是一样的,但是如果是方法就不一样了。具体不展开,一般用不到。
建议60 区别__getattr__()和__getattribute__()方法
他们都是可以用作实例属性的获取和拦截,前者适用于未定义的属性,即该属性在实例中以及对应类的基类和祖先类中都不存在,而后者对于所有属性的访问都可以调用。注意,后者总会被调用,而__getattr__()只有在__getattribute__()中发生异常的时候才会被调用。
建议61 使用更为安全的property
property是用来实现属性可管理性的built-in数据类型,其本质是一种特殊的数据描述符,如__get__(), set()等,与普通描述符区别是他是一种高级应用,以标注库的形式提供描述符的实现。
建议62 掌握metaclass
元类是关于类的类,是类的模板,是用来控制如何创建类的,元类的实例是类,正如类的实例是对象。举个栗子,python标准库中的string.Template.string中,Template的元类是_TemplateMetaclass。
建议63 熟悉python对象协议
-
类型转换协议,如__str__(), int(), float()等
-
比较大小的协议,如__cmp__()
-
数值类型相关的协议,如__add__(), and(), pos()等
-
容器类型协议,如__lan__(), getitem()等
-
可调用对象协议,如__call__()等
-
可哈希对象协议,如__hash__()
-
对描述符和属性交互协议,如__getattr__(), setattr()等
建议64 利用操作符重载实现中缀语法
需要了解pipe库,举个栗子,
# 求小于4000000的斐波那契数列中的偶数和
from pipe import *
def fib():
a,b = 0,1
while True:
yield a
a,b = b,a+b
euler2 = fib() | where(lambda x:x % 2 == 0) | take_while(lambda x:x < 4000000) | add
assert euler2 == 4613732