序列类型(sequence types)可变序列不可变序列collections.abc
一、序列类型的分类
1. 不可变序列(immutable sequences)
创建后无法修改元素的序列,核心类型包括:
str:字符串(unicode字符序列)tuple:元组(异构元素序列)bytes:字节序列(不可变)range:整数范围序列(动态生成,不可变)
2. 可变序列(mutable sequences)
创建后可修改元素的序列,核心类型包括:
list:列表(异构元素序列)bytearray:字节数组(可变字节序列)array.array:数组(同构数值序列,需导入array模块)collections.deque:双端队列(高效增删的可变序列)
二、序列类型的继承关系(基于抽象基类)
python通过collections.abc模块定义抽象基类(abc),规定序列类型的接口标准,具体类型继承或实现这些抽象基类的方法。
核心抽象基类层级
iterable(可迭代)
↓
collection(集合,python 3.6+)
↓
sequence(序列)
├── mutablesequence(可变序列)
└── immutablesequence(不可变序列,python 3.3+)
各抽象基类的关键方法
| 抽象基类 | 核心方法/特性 |
|---|---|
| iterable | 需实现__iter__(),支持for循环迭代 |
| collection | 继承iterable+sized(__len__())+container(__contains__()) |
| sequence | 继承collection,需实现__getitem__()和__len__(),支持索引、切片、index()、count() |
| immutablesequence | 继承sequence,无修改方法(如__setitem__()) |
| mutablesequence | 继承sequence,需实现__setitem__()、__delitem__()、append()等修改方法 |
具体类型的继承实现
不可变序列类型:
str、tuple、bytes、range 均实现 immutablesequence 接口(或直接继承sequence并禁用修改方法)。
例如,tuple 继承关系:tuple → sequence → collection → iterable。可变序列类型:
list、bytearray、array.array、collections.deque 均实现 mutablesequence 接口。
例如,list 继承关系:list → mutablesequence → sequence → collection → iterable。
三、序列类型的共性与差异
共性(所有序列)
- 支持索引访问:seq[index]
- 支持切片:seq[start:end:step]
- 支持长度计算:len(seq)
- 支持成员判断:x in seq
- 支持拼接:seq1 + seq2(不可变序列拼接生成新对象,可变序列可原地扩展)
- 支持重复:seq * n
差异
| 特性 | 不可变序列(如tuple/str) | 可变序列(如list/deque) |
|---|---|---|
| 元素修改 | 不支持(seq[index] = x报错) | 支持 |
| 原地操作 | 无(如append()/pop()) | 支持 |
| 内存效率 | 更高(固定大小) | 较低(动态扩容) |
| 哈希性 | 可哈希(可作为字典键) | 不可哈希 |
四、自定义序列类型
通过继承抽象基类(如sequence或mutablesequence),可快速实现自定义序列,只需重写必要方法:
from collections.abc import mutablesequence
class mylist(mutablesequence):
def __init__(self, data):
self.data = list(data)
def __getitem__(self, index):
return self.data[index]
def __setitem__(self, index, value):
self.data[index] = value
def __delitem__(self, index):
del self.data[index]
def __len__(self):
return len(self.data)
def insert(self, index, value):
self.data.insert(index, value)
# 使用自定义序列
ml = mylist([1,2,3])
ml.append(4) # 继承mutablesequence的方法
print(ml[2]) # 输出3
总结
python序列类型以抽象基类为骨架,分为不可变和可变两类:
- 不可变序列:str/tuple/bytes/range,继承immutablesequence;
- 可变序列:list/bytearray/deque/array,继承mutablesequence。
这种设计既保证了接口一致性,又通过抽象基类明确了不同序列的行为约束。
到此这篇关于python序列类型的实现示例的文章就介绍到这了,更多相关python序列类型内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论