版权声明:转载 或者复制请标注来源 https://blog.csdn.net/qq_34979346/article/details/83311526
序列类型的协议
- 序列抽象基类的数据结构 都在 from collections import abc 这个模块,我们打开 from _collections_abc import all,在abc 模块里面可以看到内容如下 :
__all__ = ["Awaitable", "Coroutine",
"AsyncIterable", "AsyncIterator", "AsyncGenerator",
"Hashable", "Iterable", "Iterator", "Generator", "Reversible",
"Sized", "Container", "Callable", "Collection",
"Set", "MutableSet",
"Mapping", "MutableMapping",
"MappingView", "KeysView", "ItemsView", "ValuesView",
"Sequence", "MutableSequence",
"ByteString",
]
可以看到 上边的列表列出来都是 collection 抽象基类. 咱们只需要关注 两个 “Sequence”, “MutableSequence”, Sequence 是不可变序列类型,MutableSequence 是可变序列类型.这些抽象类型有利于我们理解数据结构以及他们的协议是什么样的.
2. Sequence
1. Sequence 继承的类
class Sequence(Reversible, Collection): #继承了两个类 Reversible, Collection
@abstractmethod # 抽象方法的标识, 如果用他必须重写这个方法
其中 Reversible 是序列的翻转,例如ABC 变成CBA,
Collection 我们继续打开这个文件如下 :
class Collection(Sized, Iterable, Container):
#又继承了这三个,Sized 大家都知道里面有个魔法喊len,可以计算序列的长度,Iterable是个迭代器又了他可以记性for循环,
#Container 他方法里有 __contains__ 魔法函数 有了它 ,我们就可以用 in 这个字段, 例如 if i in list()
__slots__ = ()
@classmethod
def __subclasshook__(cls, C):
if cls is Collection:
return _check_methods(C, "__len__", "__iter__", "__contains__")
return NotImplemented
- Sequence 的魔法函数构成了序列的协议. 魔法函数不单指Sequence 自身抽象方法和魔法函数还包括他自己继承类里面的.
打开Sequence 类查看方法如下:
@abstractmethod
def __getitem__(self, index): #这个前面已经讲过,可以把类对象变成 序列对象.
raise IndexError
def __iter__(self): # 迭代器 有了它,可以用for 循环.
i = 0
try:
while True:
v = self[i]
yield v
i += 1
except IndexError:
return
def __contains__(self, value): # 可以用 in 方法 判断是否在容器里面
for v in self:
if v is value or v == value:
return True
return False
def __reversed__(self): #序列的翻转
for i in reversed(range(len(self))):
yield self[i]
3.MutableSequence 是可变的序列
打开文件后可以看到这个类 , 他是继承 了Sequence 除了具有它继承的特性外,它又新加了一些特性 如
setitem,delitem,insert, append,clear, reverse,extend,pop,remove,iadd.
这些都是可变序列的特性.
class MutableSequence(Sequence):
__slots__ = ()
"""All the operations on a read-write sequence.
Concrete subclasses must provide __new__ or __init__,
__getitem__, __setitem__, __delitem__, __len__, and insert(). #说明 提示要实现这些方法.
"""
@abstractmethod #必须实现的方法
def __setitem__(self, index, value):
raise IndexError
@abstractmethod #必须实现的方法
def __delitem__(self, index):
raise IndexError
@abstractmethod #必须实现的方法
def insert(self, index, value):
'S.insert(index, value) -- insert value before index'
raise IndexError
def append(self, value):
'S.append(value) -- append value to the end of the sequence'
self.insert(len(self), value)
def clear(self):
'S.clear() -> None -- remove all items from S'
try:
while True:
self.pop()
except IndexError:
pass
def reverse(self):
'S.reverse() -- reverse *IN PLACE*'
n = len(self)
for i in range(n//2):
self[i], self[n-i-1] = self[n-i-1], self[i]
def extend(self, values):
'S.extend(iterable) -- extend sequence by appending elements from the iterable'
for v in values:
self.append(v)
def pop(self, index=-1):
'''S.pop([index]) -> item -- remove and return item at index (default last).
Raise IndexError if list is empty or index is out of range.
'''
v = self[index]
del self[index]
return v
def remove(self, value):
'''S.remove(value) -- remove first occurrence of value.
Raise ValueError if the value is not present.
'''
del self[self.index(value)]
def __iadd__(self, values):
self.extend(values)
return self