python3:序列类型协议结构,你懂了吗?

版权声明:转载 或者复制请标注来源 https://blog.csdn.net/qq_34979346/article/details/83311526

序列类型的协议

  1. 序列抽象基类的数据结构 都在 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
  1. 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 除了具有它继承的特性外,它又新加了一些特性 如
setitemdelitem,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

猜你喜欢

转载自blog.csdn.net/qq_34979346/article/details/83311526
今日推荐