主要内容
一、协议
要想成功实现容器的定制,需要先明白协议。
协议类似其他编程语言中的接口,规定了哪些方法必须要定义。
关于定制容器的一些协议:
像序列类型(如列表、元组、字符串)或者映射类型(字典)都是属于容器类型
如果希望定制的容器是不可变的话,只需要定义__len__()
和__getitem__()
方法
如果希望定制的容器是可变的话,除了定义__len__()
和__getitem__()
方法还需要定义__setitem__()
和__delitem__()
两个方法
二、定制容器类型相关的魔法方法
魔法方法 | 含义 |
---|---|
__len__(self) | 定义当被len()函数调用时的行为(返回容器中元素的个数) |
__getitem__(self, item) | 定义获取容器中指定元素的行为,相当于self[key] |
__setitem__(self, key, value) | 定义设置容器中指定元素的行为,相当于self[key]=value |
__delitem__(self, key) | 定义删除容器中指定元素的行为,相当于del self[key] |
__iter__(self) | 定义当迭代容器中的元素的行为 |
__reversed__(self) | 定义当被reversed()函数调用时的行为 |
__contains__(self, item) | 定义当使用成员测试运算符(in或not in)时的行为 |
- 示例:
class CountList:
def __init__(self,*args):
# 列表推导式
self.values = [x for x in args]
# self.valus = list(args)
self.count = {}.fromkeys(range(len(self.values)),0)
# 使用数组下标做字典的键,注意不能用元素作为字典的键
# 因为列表不同的下标可能有值一样的元素,但字典不能有两个相同的键
def __len__(self):
return len(self.values)
def __getitem__(self, item):
self.count[item] += 1
return self.values[item]