python中的序列类型杂谈
继承关系
在collection.abc中,可以看见所有的python序列基类。包括Set,Sequence等重要的基类,我们在python中要使用的类多继承于这些基类。
Sequence为例解析继承关系
在文件下找到Sequence类型,它明显继承了两个基类Reversible和Collection,Reversibe使得这个类是可以反转的
再看到Reversible类型,这个类型存在一个@abstractmethod修饰的抽象方法,在继承它的类型中,需要实现这个方法。
看回Sequence类型,最底下实现了__reversed__方法,用以反转这个序列。
再回到其继承的第二个基类Collection
它又继承了三个基类,Sized,Iterable,Container
这三个类型又带了三个抽象方法(abstractmethod)len,contains,__iter__需要实现。
但是在这里只能看见__contains__和__iter__的实现,__len__则涉及到Cpython的C语言源码部分,不是一时半会能说清楚的。值得一提的是__contains__函数实现后可以直接调用本函数来实现if in 来判断元素是否在序列中,但是即便没有实现,也是可以经行if in的判断的,这时就是使用getitem函数从头到尾的遍历了。
MutableSequence
MutableSequence继承了Sequence但其增加了setitem,delitem,insert三个方法用来实现可变序列。
最后看到两个类的register部分,list被注册为可变类型,而tuple是不可变类型。