10天读完《编写高质量代码 改善Python编程的91个建议》——Day7

计划

Hello,这是一个读书摘要的计划,10天读完《编写高质量代码 改善Python编程的91个建议》,我会每天摘录大概9个书中提到的建议,分享在这里,也作为自己的打卡任务。关于这本书,他并不是python入门的教学书籍,而是一本用来改善编程习惯和风格的书,可以帮助我们写出漂亮的,也就是符合pythonic的python代码。书中的知识难度不会很大,每天看几条,然后落实到实际编程中加以巩固,就能融会贯通,久而久之也就能养成好的编程习惯。如果你没有时间看原书,那么直接看我的摘要就好啦,遇到感兴趣的再去详细了解也会方便很多,当然这里摘要的内容是我觉得有用的部分啦。注意,一定要会运用!

书摘

建议56 理解名字查找机制

使用locals()可以查看所有局部变量,使用globals()可以查看所有全局变量。

理解4种作用域:局部作用域、全局作用域、嵌套作用域和内置作用域。

建议57 为什么需要self参数

self本身就是实例对象本身,是对对象本身的引用。为什么需要self呢?

  1. python设计之初参考率其他语言,如Moudla-3中的self。

  2. python本身的动态性决定使用self能带来一些便利。

  3. 在存在同名的局部变量以及实例变量的情况下使用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对象协议

  1. 类型转换协议,如__str__(), int(), float()等

  2. 比较大小的协议,如__cmp__()

  3. 数值类型相关的协议,如__add__(), and(), pos()等

  4. 容器类型协议,如__lan__(), getitem()等

  5. 可调用对象协议,如__call__()等

  6. 可哈希对象协议,如__hash__()

  7. 对描述符和属性交互协议,如__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
posted @ 2020-07-26 00:58  MrDoghead  阅读(156)  评论(0编辑  收藏  举报