《流畅的python》读书笔记(五)
8.2 is和==
is比较的是的标识,由于is不支持重载,因此会直接比较, ==比较的是值,
只有绝对不可变的元组才可以作为字典的键或集合的元素.
8.4 不能使用可变数据类型作为参数.
8.5 del 只是删除名称,而不是善处对象, 对象的引用计数会减1
8.6 弱引用weakref
不增加引用计数的引用. 常用于缓存
import weakref
a = {1,2}
wref = weakref.ref(a)
print(wref())
a = {1,1}
print(wref())
weakref.WeakValueDictionary
值是对象的弱引用, 当对象消失时, 对应的键值对会自动删除, 常用于缓存.
弱引用的对象不能是原生的list和dict,可以是他们的子类或set
8.7 拷贝
序列使用[:]进行拷贝, 非序列使用.copy()进行拷贝. 对于可变数据类型是深拷贝, 对于不可变类型是浅拷贝.
9.7 私有属性和受保护的属性
python会对前置双_的方法和属性进行名字重整,在前面拼接类名, 因此不能通过原名字访问到.
前置单_的属性不会被特殊处理, 但是约定俗成不会在类的外部访问, 成为受保护的属性/方法.
9.8 __slots__属性
slots__属性只能作为类属性定义, 不能继承.
slots = (“属性名1”, “属性名2”)
使用元组存储实力是维护性,而不再使用字典.从而大大节约空间(若干数量级), 但是初始化后,不能赋值或新增实例属性.
实现了__slots__属性得到类不再支持弱引用, 除非在__slots__中加入__weakref
10.2 缩略显式
显式指定长度的内容,中间用…省略
import reprlib
s = “0123456789”*4
s1 = reprlib.repr(s)
print(s)
print(s1)
10.3 协议和鸭子
序列需要实现__len__和__getitem__
切片的数据会交给slice进行处理
cut = slice(start, stop, stride).indices(len)
# 返回非负不越界的索引和步长的三元组
cut = slice(-10, 100, 2).indices(10)
print(cut)
10.5 动态存取属性
在实例和父类中查找不到的属性,会调用__getattr__()方法, 对动态赋值进行限制需要重写__setattr__()方法.
10.6
规约函数sum, any, all, reduce把有限元素的可迭代对象编程一个聚合结果.
eq()的实现
def eq(self, other):
return self == other
判断相同数据类型的序列相等
len(seq1) == len(seq2) and all([i1 == i2] for i1, i2 in zip(seq1, seq2))
组包zip(seq1, seq2, …,fillvalue=False)函数, 返回生成器, 并行迭代.
itertools封装了一系列返回生成器的方法
chain(seq1, seq2)合并多个序列,返回生成器对象
from itertools import chain
s1 = "111"
s2 = "222"
s = chain(s1, s2)
print(s)
print(list(s))
10.9 协议
模拟内置类型实现类的时候只需要实现用到的部分协议即可
处理多维列表运算的时候,应该转成ndarray