1. 协议
Python 中创建自定义序列通常的方式是继承内置的数据类型,使用collections模块中的UserDict UserList等数据。
如果要创建完全自定义的序列, 需要实现 Python 中自定义容器类型其中一些协议。
首先,有用于定义不可变容器的协议:要创建不可变容器,您只需要定义 __len__ 和 __getitem__
对于可变容器, 需要实现 __setitem__ 和 __delitem__。
如果容器对象需要支持迭代,还需要实现一个返回一个迭代器的 __iter__ 方法
方法 |
说明 |
使用 |
__len__(self) |
返回容器的长度 |
len(obj) |
__getitem__(self, key) |
使用name访问容器内数据 |
obj[name] |
__setitem__(self, key, value) |
为容器内数据赋值的行为 |
obj[name] = value |
__delitem__(self, key) |
删除容器内指定数据 |
del obj[name] |
__iter__(self) |
为容器返回一个迭代器 |
iter(obj) for x in obj |
__contains__(self, key) |
判断是否包含某个数据, 应该返回一个bool值 |
in not in |
__reversed__(self) |
应该返回序列的反向版本 |
reversed(obj) |
__missing__(self, key) |
用于 dict 它定义了每当访问字典中 不存在的键时的行为 |
obj[missing] |
一个自定义列表的示例:
In [1]: class FunctionalList:
...: def __init__(self, values=None):
...: if values is None:
...: self.values = []
...: else:
...: self.values = values
...:
...: def __len__(self):
...: return len(self.values)
...:
...: def __getitem__(self, key):
...: return self.values[key]
...:
...: def __setitem__(self, key, value):
...: self.values[key] = value
...:
...: def __delitem__(self, key):
...: del self.values[key]
...:
...: def __iter__(self):
...: return iter(self.values)
...:
...: def __reversed__(self):
...: return FunctionalList(reversed(self.values))
...:
...: def append(self, value):
...: self.values.append(value)
...:
...: def head(self):
...: # 获取第一个元素
...: return self.values[0]
...:
...: def last(self):
...: # 获取最后一个元素
...: return self.values[-1]
...:
...: def drop(self, n):
...: # 删除前 n 个元素
...: return self.values[n:]
In [2]: funl = FunctionalList([1,2,3,4])
In [3]: funl[0]=9
In [4]: funl.head()
Out[4]: 9